2012-08-22 48 views
0

我目前擁有一個Customer_nested_attributes_for特性的Customer表單。這些功能可以是任何數量的東西,但爲了簡單起見,我們將假設他們是名字,姓氏和出生日期(我知道這是EAV的問題 - 如果您對此有意見,請看到我關於這個問題的其他問題)。Rails - 在表單視圖中指定屬性/動態構建嵌套屬性

在我的控制,我有:

3.times {@customer.features.build} 

這工作得很好,並建立3個功能,其中保存預期。但是,我想要爲視圖中的每個構建要素指定要素類型。我的看法目前看起來像:

<%= customer.fields_for :features do |features_builder| %> 
    <%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "First Name", :form_actions_visible => false} %> 
<% end -%> 

正如人們所期望的那樣,這會創建3個名字字段。我要的是能夠指定3層不同的功能,如:

<%= customer.fields_for :features do |features_builder| %> 
    <%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "First Name", :form_actions_visible => false} %> 
    <%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "Last Name", :form_actions_visible => false} %> 
    <%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "Date of Birth", :form_actions_visible => false} %> 
<% end -%> 

顯然如上所寫的代碼不起作用,因爲它正試圖爲每個實例創建3個字段。看起來我需要的是一個fields_for循環的索引,它允許我迭代併爲每個部分添加一個if子句,以便它只觸發一次,並且每個觸發另一個功能實例。

任何人都可以指出我怎麼能做到這一點?搜索後,我似乎無法找到獲取fields_for循環索引的方法。

編輯:根據第一條評論,爲了清晰起見:我想在頁面上呈現三個特徵,每個特徵由控制器構建。我希望每個功能都以不同的方式渲染(在上面的代碼中使用不同的局部變量:fixed_feature_type)。我正在尋找最好的方法來做到這一點。編輯2:我知道另一種方法來做到這一點將動態地在控制器中建立嵌套屬性(而不是最初建立3) - 有沒有辦法做到這一點?

編輯3:已經花了一些時間來尋找一種方式來動態地做到這一點,我已經從一個Railscast看起來臨到一個輔助方法,如:

def link_to_add_fields(name, f, association) 
    new_object = f.object.class.reflect_on_association(association).klass.new 
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
    render(association.to_s.singularize + "_fields", :f => builder) 
    end 
    link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")) 
end 

看來,我可能能夠定義這樣的輔助方法可以讓我添加各種特徵字段 - 我很樂意將標記爲答案的任何建議,以便如何修改以適應我目前的情況。

+0

你想顯示'3種不同類型的功能',這是什麼意思?如果我沒有真正明白你在問什麼:) – pkurek

+0

我已經添加了一個編輯,希望能給出一些額外的清晰的問題。 –

回答

1

我能夠通過將我的部分渲染移動到自定義幫助程序來解決此問題,該幫助程序允許我根據需要動態構建對象。

編輯:按照要求,我的代碼如下:

我已經添加了下面的代碼我application_helper.rb文件:

module ApplicationHelper 

    def add_feature_fields(feature_types, object_form_builder, actions_visible) 
    feature_types.length.times {object_form_builder.object.features.build} 
    i = -1 
    object_form_builder.fields_for :features do |features_builder| 
     i = i + 1 
     render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => feature_types[i], :form_actions_visible => actions_visible} 
    end 
    end 
end 

我打電話這個幫手,像這樣在我的觀點:

<%= add_feature_fields(["First Name", "Last Name", "Date of Birth"], customer, false) %> 

這讓我按要求通過簡單地添加額外的項目到陣列模式(在這種情況下,一個人)添加儘可能多的功能。

希望這會有所幫助!

編輯:「功能/ _fixed_feature.html.erb」

<%= feature.hidden_field :feature_type_id, :value => FeatureType.where(:value => fixed_feature_type).first.id %> 
<fieldset> 
     <div class="control-group"> 
     <label class="control-label"><Value><%= fixed_feature_type %></label> 
     <div class="controls"> 
      <%= feature.text_field :value, :class => 'input-large' %> 
     </div> 
    </div> 
    <% if form_actions_visible == true %> 
     <div class="form-actions"> 
      <%= content_tag :button, :type => :submit, :class => "btn btn-info" do -%> 
       Save Changes 
      <% end -%> 
      <%= content_tag :button, :type => :cancel, :class => "btn btn-warning" do -%> 
       Cancel 
      <% end -%> 
     </div> 
    <% end %> 
</fieldset> 

什麼特別之處這一點,只需要通過輔助傳遞渲染標籤等的局部變量,而無需「功能型「框然後是一個值框(它只呈現一個值框,因此類型是固定的)。根據您的意見,如果您想爲不同模型添加功能,您只需再次調用助手並更改「客戶」部分(這是表單生成器 - 更常見的是'f',但我更喜歡更多語義命名)。

+0

嗨@HO ...你會願意發佈你的解決方案...我有一個類似的問題在這裏:[鏈接](http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/515cd04ce977d738/787d3f5f61e35754?hl = en&lnk = gst&q =嵌套+表單+和+鏈接#787d3f5f61e35754) – thomasvermaak

+0

您好railguage48 - 我已經添加了我的代碼,希望這有助於 - 讓我知道是否需要任何額外的位來放在一起。 –

+1

感謝您分享您的解決方案...很高興看到您已經制定出解決方案。我會嘗試看看我是否可以將其應用於我的問題。我不知道你是否能夠查看我提供的鏈接,但是我有一個表中的三個屬性和另一個表中的一個屬性,我希望在某些情況下添加到我的表單中三到四次,以便我有三個或四行這些屬性。我可以將這些屬性組合在同一個數組中嗎?也可以解壓縮「features/fixed_feature」...是那兩個partials? – thomasvermaak