如何解决关系模型的rails 3脚手架
是否有任何教程可以建立一个使用多对多关系的简单模型?解决方法
我在Rails 3.0.5上使用ruby 1.9.2逐步创建以下testapp时编写了此教程。另请参阅\'Gemfile \'了解我使用的宝石(可下载整个Testapp,链接在第15部分的末尾)。因此,这里去:
1)转到您要创建测试应用的地方,然后
rails new mynewtestapp
cd mynewtestapp
2)然后添加2个具有has_and_belongs_to_many关联的模型
rails g scaffold book title:string author:string
rails g scaffold user name:string age:integer
3),那么您需要为该关联创建连接表...默认情况下,rails会寻找一个表,该表的名称由按字母顺序排列的两个相关表的名称组成...因此,让我们创建一个迁移来创建这样一个表表
rails g migration createBooksUsers
4)打开生成的迁移文件,这时看起来像
class CreateBooksUsers < ActiveRecord::Migration
def self.up
end
def self.down
end
end
5)修改为如下所示
class CreateBooksUsers < ActiveRecord::Migration
def self.up
create_table :books_users,:id => false do |t|
t.integer :book_id
t.integer :user_id
end
end
def self.down
drop_table :books_users
end
end
6)将has_and_belongs_to_many关联添加到书籍和用户模型中,以及通过该关系添加的新ID
app / model / book.rb
class Book < ActiveRecord::Base
attr_accessible :title,:author,:user_ids
has_and_belongs_to_many :users
end
app / model / user.rb
class User < ActiveRecord::Base
attr_accessible: :name,:age,:book_ids
has_and_belongs_to_many :books
end
7)现在我们的模型和迁移已经完成...让我们创建表
rake db:create
rake db:migrate
(如果使用sqlite3或已创建要手动使用的数据库,则可能无需创建,如果没有添加与安装数据库管理系统有关的任何内容,此示例将使用sqlite进行工作。但是由于有很多并且实际上所有值得使用的东西都有很好的记录,您会很快找到任何帮助)
8)现在决定将哪个对象分配给哪个对象。...当然,您可以同时使用两种方法...我将简单说明这一点,并向其中一个演示...可以说您只有几个用户并希望将它们分配给书籍...
在这一点上,我想说让我们获得一些外部帮助,例如建议使用二进制x ...但是为了简单起见,我会选择Formtastic作为simple_form gem。我想每个人都有自己的收藏夹...但是simple_form似乎可以根据您的意愿在css样式化整个输出中给您更多的自由...所以现在让我们安装simple_form,只需执行
echo \"gem \'simple_form\',:git => \'git://github.com/plataformatec/simple_form.git\'\" >> Gemfile
将simple_form添加到您的Gemfile中,然后运行
bundle install
并通过以下方式将简单的表单安装到您的应用程序(即生成配置,默认样式和语言文件)
rails g simple_form:install
9)是时候修改我们的书籍表格了
现在的书形应该是这样的
app / views / books / _form.html.erb
01 <%= form_for(@book) do |f| %>
02 <% if @book.errors.any? %>
03 <div id=\"error_explanation\">
04 <h2><%= pluralize(@book.errors.count,\"error\") %> prohibited this book from being saved:</h2>
05
06 <ul>
07 <% @book.errors.full_messages.each do |msg| %>
08 <li><%= msg %></li>
09 <% end %>
10 </ul>
11 </div>
12 <% end %>
13
14 <div class=\"field\">
15 <%= f.label :title %><br />
16 <%= f.text_field :title %>
17 </div>
18 <div class=\"field\">
19 <%= f.label :author %><br />
20 <%= f.text_field :author %>
21 </div>
22 <div class=\"actions\">
23 <%= f.submit %>
24 </div>
25 <% end %>
使用simple_form,我们可以替换上面的一些代码(第1和14-24行),因此整个文件将如下所示:
01 <%= simple_form_for(@book) do |f| %>
02 <% if @book.errors.any? %>
03 <div id=\"error_explanation\">
04 <h2><%= pluralize(@book.errors.count,\"error\") %> prohibited this book from being saved:</h2>
05
06 <ul>
07 <% @book.errors.full_messages.each do |msg| %>
08 <li><%= msg %></li>
09 <% end %>
10 </ul>
11 </div>
12 <% end %>
13
14 <%= f.input :title %>
15 <%= f.input :author %>
16 <%= f.association :users %>
17
18 <%= f.button :submit %>
19
20 <% end %>
10)现在您可能要启动您的应用程序
rails s
添加一些用户,然后添加一本书,这是您的第一个has_and_belongs_to_many形式:
11)好吧,这也许并不是最漂亮的东西,但是简单添加样式表将有所帮助...创建一个新文件
public/stylesheets/simple_form.css
并将以下行粘贴到其中
/* public/stylesheets/simple_form.css */
.simple_form label {
float: left;
width: 100px;
text-align: right;
margin: 2px 10px;
}
.simple_form div.input {
margin-bottom: 10px;
}
.simple_form div.boolean,.simple_form input[type=\'submit\'] {
margin-left: 120px;
}
.simple_form div.boolean label,.simple_form label.collection_radio,.simple_form label.collection_check_boxes{
float: none;
margin: 0;
}
.simple_form .error {
clear: left;
margin-left: 120px;
font-size: 12px;
color: #D00;
display: block;
}
.simple_form .hint {
clear: left;
margin-left: 120px;
font-size: 12px;
color: #555;
display: block;
font-style: italic;
}
然后重新加载页面,然后... Tadaa ...首先攻击...
12)如果您不喜欢多选列表框,请返回书籍表格
app / views / books / _form.html.erb
并修改行
15 <%= f.input :author %>
稍微
15 <%= f.input :author,:as => :check_boxes %>
使列表框之外的复选框...。但是... ewww...。看一下:
13)似乎有些错误...选项的从左到右表示有时会麻烦simple_form greenhorns,但实际上这是一个易于解决的问题
并且除了这个小格式问题外,您可能还希望看到用户的年龄在括号内落后于他的名字,例如\'Tom(25)\'
...所以让我们做3个快速修复
a)取消注释并在config / initializers / simple_form.rb中设置2个选项,以便用div包装每个复选框并将这些复选框组放在字段集中
# You can wrap a collection of radio/check boxes in a pre-defined tag,defaulting to none.
config.collection_wrapper_tag = :fieldset
# You can wrap each item in a collection of radio/check boxes with a tag,defaulting to none.
config.item_wrapper_tag = :div
b)稍微修改我们的simple_form.css样式表,如添加所示:
fieldset { border: 0; }
...除非您不希望在田野周围使用大而丑陋的边框
c)在我们的用户模型中创建方法“ to_label \”,因为默认情况下,“ to_label \”是第一个方法simple_form寻找,以获取用于表示对象的字符串表示形式。由于发生了一起奇怪的事件,我们的模型用户有一个名为“名称”的列。就像name也是simple_form在模型中寻找的方法一样,我们很幸运这个应用程序到目前为止已经工作了。如果我们改用name列的名字命名,Rails不会列出用户名,而是列出默认的红宝石对象表示形式(例如<#User:521369846>)。猜猜我们很幸运;-)
app / models / user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :users
def to_label
\"#{name} (#{age})\"
end
end
编辑表格看起来很漂亮...
14)现在,只有显示视图需要显示图书所有者...也不太难,只需打开显示视图
app / views / books / show.html.erb
并添加第13-16行以显示图书所有者:
01 <p id=\"notice\"><%= notice %></p>
02
03 <p>
04 <b>Title:</b>
05 <%= @book.title %>
06 </p>
07
08 <p>
09 <b>Author:</b>
10 <%= @book.author %>
11 </p>
12
13 <p>
14 <b>Who owns a copy?</b>
15 <%= @book.users.map {|x| x.to_label}.join \',\' %>
16 </p>
17
18 <%= link_to \'Edit\',edit_book_path(@book) %> |
19 <%= link_to \'Back\',books_path %>
最后但并非最不重要的...秀场
15)好吧,这对于快速学习habtm或用rails中的has_and_belongs_to_many关联来说非常重要。我将在网上撰写此应用程序时创建的测试应用程序放在了
https://1drv.ms/u/s!Alpu50oGtUZq7AiJkL08QqBiMAjb
,观看Ryan Bate \关于令牌字段的教程:
http://railscasts.com/episodes/258-token-fields
这是在Rails中建立多对多关系的简单方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。