2013-03-30 70 views
0

在我的Rails應用程序中,我使用了多次使用fields_for的表單,有時會將調用嵌套到fields_forRoR - 調用fields_for次數可變的幫助程序方法

不幸的是,圖形設計師堅持要求輸入字段的排序方式不會根據它們所屬的模型進行分組。因此,我想成爲一名助手,可以輕鬆地爲我構建fields_for塊,但我看不到如何讓輔助方法嵌套可變數量的塊。

爲了說明,我設想的代碼看起來像以下:

<%= form_for @object do |f| %> 
    <!-- The helper method should have a similar effect to the following... --> 
    <%= f.fields_for :assoc_a do |assoc_a_builder| %> 
    <%= assoc_a_builder.fields_for :assoc_b do |assoc_b_builder| %> 
     <%= assoc_b_builder.text_field :field_name %> 
    <% end %> 
    <% end %>  
    <!-- ...when given the following data... --> 
    <%= my_helper [f, :assoc_a, :assoc_b], :text_field, :field_name %> 

<% end %> 

任何想法如何,我可以做到這一點?

+0

你重歸於好? – ardochhigh

+1

請參閱下面的答案。 – JellicleCat

回答

1

我實現了下面的helper方法(可能不是最好的東西)。

實例函數調用鑑於:

<%= form_for @object do |builder| %> 
    <%= nested_form_field 'My label text', [builder, :association_name, :field_name], :collection_select, :my_model_id, MyModel.all, :id, :name %> 
<% end %> 

函數定義:

# Outputs a label and input, nesting calls to fields_for if 'form' arg is an Array. 
    # e.g. <%= nested_form_field nil, [builder, :approved_details], :collection_select, :my_model_id, MyModel.all, :id, :name %> 
    # Make label_text nil for just the input tag, no wrapping elements. 
    def nested_form_field label_text, form, helper_method, field, *args_for_helper_method 
    if form.is_a? Array 
     if form.length > 1 
     form.shift.fields_for form.first do |builder| 
      form[0] = builder 
      nested_form_field label_text, form, helper_method, field, *args_for_helper_method 
     end 
     else 
     nested_form_field label_text, form.first, helper_method, field, *args_for_helper_method 
     end 
    else 
     if label_text.nil? 
     form.send helper_method, field, *args_for_helper_method 
     else 
     %Q(<div class=row> 
     <div class=span4>#{label_text}</div> 
     #{ form.send helper_method, field, *args_for_helper_method } 
     </div>).html_safe 
     end 
    end 
    end 
0
<%= 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

我意識到這可以完成工作,但需要爲我的案例輸入太多的內容,我可能會在兩個屬性集中嵌套某些內容,並且只會爲單個輸入打開該嵌套,然後必須執行完全不同的操作。 – JellicleCat

+0

這是一個快速和骯髒的方法 - 對於原型設計很有用,但是對於在許多應用程序中使用的列順序而言,依賴性太大。這是一種有趣的技術,就像你自己的方法一樣。乾杯 – ardochhigh

相關問題