我是Rails的新手,我一直很开心,直到我与check_box_tag
挣扎。我在这个网站上已经阅读了很多问题,但我仍然没有解决我的问题。我确信这是我失踪的东西。
我有一个reportdetail
表和一个buginfo
表。 buginfo
表表示我想在某个程序中找到的错误的只读表。 reportdetail
表将保存包含用户想要查找的错误列表(来自buginfo表)的报告。我可以在报告详细信息表中包含许多报告。
class Reportdetail < ActiveRecord::Base
has_many :buginfos
end
class Buginfo < ActiveRecord::Base
belongs_to :reportdetail
end
这是我的架构。这很简单:
ActiveRecord::Schema.define(:version => 20111221162309) do
create_table "buginfos", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "reportdetails", :force => true do |t|
t.string "name"
t.integer "buginfo_id"
t.boolean "bug_detected"
t.datetime "created_at"
t.datetime "updated_at"
end
end
最后我的部分_form.html.erb为reportdetail
:
<%= form_for(@reportdetail) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<table>
<% Buginfo.find(:all).each do |buginfo| %>
<tr>
<td> <%= check_box_tag("[buginfo_id][]",1,buginfo.id) %> </td>
<td> <%= buginfo.name %> </td>
</tr>
<% end %>
</table>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
表单正确显示每个错误旁边的复选框,我甚至可以单击复选框,但数据永远不会保存。我知道check_box_tag
的第一个参数需要是唯一的,我很确定这是正确的。我知道第二个参数是复选框的值,但这究竟意味着什么?我假设这意味着这个错误是否被选中的当前值,但由于我还没有选择任何东西,我不知道该怎么办。根据我阅读的文档,第三个参数应该是“复选框是否已选中?”但又一次,这是相对于什么的? - 当前值或......
如果用户正在创建一个新的reportdetail
并假设buginfos数据库中有5个错误,我假设有5个复选框显示在/ reportdetail / new上。这恰好发生了。如果我为reportdetail选择3个错误(选中复选框),我假设将在数据库中创建三个记录来表示报告要包含的每个错误。这根本不会发生。我只得到一条记录,buginfo_id和bug_detected都是零。
非常感谢任何指导。谢谢你能给我的任何帮助。
答案 0 :(得分:1)
您的基本form_for / standard创建操作实际上只想创建一个对象。
至于check_box标签的参数,
我会在这里做什么
<%= check_box_tag 'buginfo_ids[]', buginfo.id %>
在视图中,按原样迭代bug infoseek。输入名称末尾的[]表示rails会将每个复选框的所有提交值(即buginfo id)收集到一个数组中,因此params [:buginfo_ids]将为nil(未选择错误)或ids数组
然后,在您的控制器中,迭代该数组并为每个buginfo ID创建一个reportdetail。我不清楚为什么要创建多个报告详细信息,每个都有一个错误信息。如果你想拥有一个habtm buginfos的单个报告细节,你可以跳过控制器中的迭代位并将输入名称更改为reportdetail [buginfo_ids] [],rails应该自动在连接表中创建行。
您的架构似乎也略微增加了您的关联声明 - 如果reportdetail has_many buginfos,那么它不需要buginfo_id。感觉你实际上想要一个habtm,或者通过联想有很多。
答案 1 :(得分:0)
在视图中
<% Buginfo.find(:all).each do |buginfo| %>
<div>
<%= check_box_tag 'buginfo_ids[]', buginfo.id -%>
<%= buginfo.name %>
</div>
<% end %>
记得在reportdetails_controller.rb
中def update
params[:buginfo_ids] ||= []
#...
end
如果您不熟悉rails,请查看railscast。 Ryan Bates多年来一直把它作为一个有趣的图书馆。搜索“check_box”_tag,你会得到10分钟。 #17 HABTM Checkboxes