使用具有has_many关系的复选框

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

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回调?

谢谢!

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

如果您使用的是simple_formsimple_form ,那将非常简单:

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

这将创建这样的东西:

           

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

看看Iain的回答。 这绝对是正确的方法,但是…我不想在这个例子中使用simple_formsimple_form来保持尽可能简单。

我使用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... Line.all @invoice.lines...应该提取到控制器和发票模型,它们不属于视图。 它们仅用于简洁起见。

我建议使用collection_check_boxes帮助方法:

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

或者哈姆尔:

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