2011-12-21 59 views
1

我是Rails的新手,我一直在玩,直到我与争执。我已经阅读了很多关于这个网站的问题,但我仍然没有解决我的问题。我相信这是我错过的东西。Rails的3.1 - 试图让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 

最后我对reportdetail部分_form.html.erb:

<%= 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 %> 

的形式正确地显示旁边的每一个错误复选框,我甚至可以点击复选框,但是数据永远不会被保存。我知道的第一个参数需要是唯一的,我很确定这是正确的。我知道第二个参数是复选框的值,但这是什么意思?我假设这意味着这个bug是否被选中的当前值,但由于我还没有选择任何东西,我不知道该怎么做。根据我读的文档,第三个参数应该是“复选框是否被选中?”但是,再一次,这是什么关系? - 当前值或...

如果用户正在创建新的reportdetail,并假设buginfos数据库中有5个错误,那么我会假设5个复选框显示在/ reportdetail/new上。这发生正确。如果我为reportdetail选择3个bug(选择复选框),我会假设在数据库中会创建三个记录来表示报告要包含的每个错误。这完全没有发生。我只得到一条记录,buginfo_id和bug_detected都是零。

任何指导将不胜感激。感谢你给与我的帮助。

+0

你真正需要的是'fields_for' http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for – Damien 2011-12-21 18:02:22

回答

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 

如果你是新轨道退房railscasts。瑞恩贝茨多年来一直把它作为一个可伸缩的库房。搜索“check_box”_tag,你会得到10分钟的时间。 #17 HABTM Checkboxes

+0

我现在得到这个错误:SQLite3 :: SQLException:没有这样的列:buginfos.reportdetail_id:SELECT 1 FROM“buginfos”WHERE“buginfos”。“reportdetail_id”IS NULL AND“buginfos”。“id”= 1 LIMIT 1这实际上对我有意义,因为reportdetail尚未保存。这就像我需要保存reportdetail然后保存错误的id。 – philw 2011-12-21 19:36:05

+0

对不起,什么错误? – 2011-12-21 19:37:32

+0

我需要buginfo和reportdetail之间的has_and_belongs_to_many关系吗? – philw 2011-12-21 19:40:20

1

您的基本form_for/standard创建操作只是真的想一次创建一个对象。

至于参数check_box标签,

  • 第一是输入名称。这基本上决定了在参数散列中的这个复选框在哪里结束(如果选中)
  • 第二个是值:如果复选框被选中,应该在params散列中放置什么(如果复选框未被选中在表单提交时,没有任何东西放在params散列表中)
  • 第三个是复选框是否应该最初显示为选中状态。

我会怎么做,这里把

<%= check_box_tag 'buginfo_ids[]', buginfo.id %> 

在视图中,遍历漏洞的Infoseek的你。输入名称末尾的[]表示rails会将每个复选框的所有提交值(即buginfo id)都收集到一个数组中,因此params [:buginfo_ids]将为零(不选择任何错误)或者然后,在您的控制器中,迭代该数组并为这些buginfo id创建一个reportdetail。我不清楚为什么你要创建多个报告详细信息,每个报告都有一个错误信息。如果你想要一个报告细节是habtm buginfos,你可以跳过控制器中的迭代位,并将输入名称更改为reportdetail [buginfo_ids] [],并且rails应该自动创建连接表中的行。

您的模式似乎也稍微增加了您的关联声明的可能性 - 如果reportdetail has_many buginfos,那么它不需要buginfo_id。这感觉就像你实际上想要一个habtm或有很多通过关联。

+0

阅读你的评论后,我想我已经开始明白你的意思了。我明白为什么让第三张表来管理报告细节和buginfos之间的关系是很重要的。我肯定会看看有关habtm的第19集栏目。在我发布任何问题之前,我会通过该示例 – philw 2011-12-21 20:47:11