2012-08-22 45 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