2011-10-08 63 views
4

我有一些包含一些行的發票。一條線只能屬於一張發票。這是我的架構看起來像:使用具有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回調嗎?

謝謝!

回答

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> 

,這是所有有給它。沒有嵌套窗體或其他需要的東西。

+0

這工作,謝謝伊恩! – Cimm

+0

這個煩人的事情是生成的空的隱藏字段。這是無用的,它干擾了這個幫手的目的(對於協會)。每次提交時,它都會向數組添加一個空字符串''。你們有沒有人知道如何解決這個問題,但仍然使用這個幫手? – Cristian

+0

也許你可以嘗試 - <%= f.input:line_ids,:as =>:check_boxes include_blank => false%> – poorva

14

看看伊恩的答案。這絕對是正確的選擇,但是......我不希望在本示例中使用simple_formformtastic以儘可能簡單。

我用Iain的HTML輸出來提取我需要的HTML。這個片段是相同的伊恩的回答,而不需要額外的庫:

<% 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...應該被提取到控制器和發票的模式,他們不認爲屬於。他們只是爲了簡潔起見。

+0

真棒,這個作品 – Harry

4

我建議使用collection_check_boxes helper方法:

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

或Haml的:

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