使用具有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_form
或simple_form
,那将非常简单:
<%= f.input :line_ids, :as => :check_boxes %>
这将创建这样的东西:
这就是它的全部。 没有嵌套表单或任何其他需要。
看看Iain的回答。 这绝对是正确的方法,但是…我不想在这个例子中使用simple_form
或simple_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