2013-06-23 44 views
0

我有一個帶有大量字段(112)的導軌模型,用於加載配置。我希望在編輯和展示形式中只顯示,如果該字段已填充。也就是說,如果數據庫中的字段爲null,則不要顯示它以進行編輯。Rails:使用simple_form遍歷屬性

有兩個記錄 - 主要是批次,並且與Primer3Batch類有1:1的關係。我試圖在批量顯示操作上對Primer3Batch類進行編輯,我不確定這是一個好主意還是甚至可以工作。

我已經使用屬性方法試圖和正在此錯誤:

undefined method `attributes' for #<SimpleForm::FormBuilder 

batches_controller.rb

def show 
    @batch = Batch.find(params[:id]) 
    @primer3 = Primer3Batch.where(:batch_id => @batch.id)[0] 

    respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @batch } 
    end 
end 

批次/ show.html.erb

<h1>Batch Details: <%= @batch.id %></h1> 

<%= simple_form_for(@primer3) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <% f.attributes.each_attribute do |a| %> 
     <% if a %><%# if a is not nil %> 
     <%= f.input a %><%# send the field to the form %> 
     <% end %> 
    <% end %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

編輯

謝謝JSWorld您指出使用實例變量的錯誤。我已經糾正它,似乎進一步,但它仍然不完全正確。這是行更改 - 注意屬性。每個屬性。每個屬性不起作用。

<% @primer3.attributes.each do |a| %> 

現在我得到的表單字段的錯誤:

undefined method `["id", 110]' for #<Primer3Batch: 

我想我需要以某種方式把這個:

a ["id", 110] 

到:

<%= f.input :id %> 

*編輯2 *

最終的代碼塊基於IIya Khokhryakov的答案。

<%= simple_form_for(@primer3) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <% @primer3.attributes.each_pair do |name, value| %> 
     <%= f.input name if value %> 
    <% end %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 
+0

我試過上面的form_for也是我得到了同樣的錯誤。 – ardochhigh

回答

1

@primer3.attributes是模型屬性及其值的散列。所以你可以做這樣的事情:

<% @primer3.attributes.each_pair do |name, value| %> 
    <%= f.input name if value %> 
<% end %> 
+0

太棒了!謝謝IIya,這正是我正在尋找的。這是一個非常有用的模式。我將用最終代碼更新問題。 – ardochhigh

2

我希望你的意圖是@primer3.attributes而不是f.attributes。該錯誤是因爲f是表單對象,並且沒有與其關聯的attributes