我目前擁有一個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
看來,我可能能夠定義這樣的輔助方法可以讓我添加各種特徵字段 - 我很樂意將標記爲答案的任何建議,以便如何修改以適應我目前的情況。
你想顯示'3種不同類型的功能',這是什麼意思?如果我沒有真正明白你在問什麼:) – pkurek
我已經添加了一個編輯,希望能給出一些額外的清晰的問題。 –