Rails 3.1 - 尝试使check_box_tag与查找表一起使用

时间:2011-12-21 17:10:12

标签: ruby-on-rails

我是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都是零。

非常感谢任何指导。谢谢你能给我的任何帮助。

2 个答案:

答案 0 :(得分:1)

您的基本form_for / standard创建操作实际上只想创建一个对象。

至于check_box标签的参数,

  • 第一个是输入名称。这基本上决定了这个复选框最终会在params散列中的位置(如果已经选中)
  • 第二个是值:如果选中复选框,应该在params散列中放入什么(如果在表单提交时未选中复选框,则不会在params散列中放入任何内容)
  • 第三个是复选框最初是否应显示为已选中。

我会在这里做什么

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