我有一些发票。一行只能属于一张发票。这就是我的架构的样子:
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回调?
谢谢!
答案 0 :(得分:14)
看看伊恩的回答。这绝对是正确的方法,但是...我不希望在这个例子中使用simple_form
或formtastic
来保持尽可能简单。
我使用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_form
或formtastic
,那就太容易了:
<%= 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