使用具有has_many关系的复选框

时间:2011-10-08 18:38:16

标签: ruby-on-rails activerecord checkbox

我有一些发票。一行只能属于一张发票。这就是我的架构的样子:

create_table "invoices" do |t|
end

create_table "lines" do |t|
  t.integer  "invoice_id"
end

我的模特:

class Invoice < ActiveRecord::Base
  has_many :lines
end

class Line < ActiveRecord::Base
  belongs_to :invoice
end

现在,在创建(或编辑)发票时,我想显示一个包含所有可能行的列表(数据库中已经存在这些行),并且每行都有一个复选框,用于将其与发票链接。

我看过HABTM问题,但我认为这不是我需要的,问题并不复杂。我认为问题是我想在发票时更新Unit#invoice_id。我可以使用嵌套表单执行此操作,还是需要在此处使用before_save回调?

谢谢!

3 个答案:

答案 0 :(得分:14)

看看伊恩的回答。这绝对是正确的方法,但是...我不希望在这个例子中使用simple_formformtastic来保持尽可能简单。

我使用Iain的HTML输出来提取我需要的HTML。这个片段与Iain的答案相同,无需额外的库:

<% Line.all.each do |line| %>
  <%= hidden_field_tag "invoice[line_ids][]" %>
  <%= check_box_tag "invoice[line_ids][]", line.id, @invoice.lines.include?(line), :id => "invoice_line_ids_#{line.id}" %>
<% end %>

PS:Line.all@invoice.lines...应提取到控制器和发票模型,它们不属于视图。它们仅用于简洁起见。

答案 1 :(得分:7)

has_many关联还会添加访问者line_ids,您可以为其创建复选框。

如果您使用的是simple_formformtastic,那就太容易了:

<%= f.input :line_ids, :as => :check_boxes %>

这将创建这样的东西:

<span>
  <input name="invoice[line_ids][]" type="hidden" value="" />
  <input checked="checked" class="check_boxes optional" id="invoice_line_ids_1" name="invoice[line_ids][]" type="checkbox" value="1" />
  <label class="collection_check_boxes" for="invoice_line_ids_1">Line Name 1</label>
</span>

<span>
  <input name="invoice[line_ids][]" type="hidden" value="" />
  <input checked="checked" class="check_boxes optional" id="invoice_line_ids_2" name="invoice[line_ids][]" type="checkbox" value="2" />
  <label class="collection_check_boxes" for="invoice_line_ids_2">Line Name 2</label>
</span>

这就是它的全部内容。没有嵌套表格或其他任何需要。

答案 2 :(得分:4)

我建议使用collection_check_boxes辅助方法:

<%= collection_check_boxes :invoice, :lines, @lines, :id, :name %>

或Haml:

= collection_check_boxes :invoice, :lines, @lines, :id, :name