带有collection_select和多个选择的嵌套表单

时间:2014-02-04 11:32:03

标签: ruby-on-rails ruby-on-rails-3 nested-forms nested-attributes

很抱歉很长的帖子,通常不经常在这里发帖。

Rails 3.1

我有一个公司模型。公司有很多自定义属性。所有属性名称都是标准化的(例如公司规模,公司收入等)。一些属性值是自定义的,一些属于“标准化”(与另一个表CompanyProperty - property_value_id的关系)。

我想要做的是添加新公司属性的表单。在表单中,我尝试一次添加不同的属性。一切正常,除了我无法弄清楚如何通过collection_select添加多个值。

以下是模特:

Company:
   has_many :properties, :class_name => 'CompanyProperty'

CompanyProperty:
   belongs_to :company
   belongs_to :property, :class_name => 'Property'
   belongs_to :property_value, :class_name => 'PropertyValue', :foreign_key => 'properties_value_id'


Property:
  has_many :company_properties
  has_many :property_values

PropertyValue:
  belongs_to :properties
  has_many :company_properties

表格(标记注释#问题,其中使用具有多个选择的collection_select):

<%= form_for(@company, :url => {:action => 'update_company', :id => @company.id}, :html => {:multipart => true}) do |f| %>
   <% @company.properties.each.with_index do |p,i| %>

        <%= f.fields_for :properties, p do |builder| %>

        <%= p.property.title %><br />

        <% if p.property.standard == 0 %>
            <%= builder.hidden_field :property_id %>
            <%= builder.text_field :value %> <br />

        <% elsif p.property.standard == 1 %>
            <%= builder.hidden_field :property_id %>
            <%= builder.collection_select(:properties_value_id, p.property.property_values, :id, :text_value, {:include_blank => true},
                                  {:class => 'form-control'}) %>
        # Problem:
        <% elsif p.property.standard == 2 %>
                    <%= builder.hidden_field :property_id %>

                    <%= builder.collection_select(:properties_value_id, p.property.property_values, :id, :text_value, {:include_blank => false},
                                  {:multiple => true, :size => p.property.property_values.count, :class => 'form-control'}) %>
        <% end %>

        <% end %>
      <% end %>



    <%= submit_tag("Save", :class => "btn btn-primary btn-block") %>
<% end %>

控制器:

  def update_company
    @company = Company.find(params[:id])
    if @company.update_attributes(params[:company])
      render :text => "Saved"
    else
      error = @company.errors.full_messages.map{|o| "<li>" + o + "</li>" }.join("") + "</ul>"
      render :text => error
    end
  end

保存所有property_id和值,但collection_select中包含多个选择的值除外。 post参数类似于这样(创建4条记录,预期结果 - 6条新记录):

  Parameters: {"company"=>{"properties_attributes"=>{"0"=>{"property_id"=>"1", "properties_value_id"=>"2"}, "1"=>{"property_id"=>"2", "value"=>"34"},

 "2"=>{"property_id"=>"3", "properties_value_id"=>["", "4", "5", "6"]}, 

"3"=>{"property_id"=>"4", "value"=>"34"}}}, "commit"=>"Save", "id"=>"16"}

property_id =&gt; 3是我想要保存的特定属性。预期的结果是在CompanyProperties表上查看三个新记录,其中property_id = 3,并相应地赋值properties_value_id。但这不会发生。只使用property_id = 3创建一条记录,properties_value_id为1(为什么?,没有这样的值)。

另外我无法理解为什么这里有空白参数“properties_value_id”=&gt; [“”,“4”,“5”,“6”]}。没有这样的价值:/

任何人都可以帮助达到我预期的结果吗?

1 个答案:

答案 0 :(得分:0)

这应该是一个评论,但我会在这里发布以保持其可读性:


空白参数可能是您选择框中的“选择器”/“默认”值。如果不这样做,你有什么办法可以看出你的HTML元素如何在property_value_ids中包含一个单独的元素?

如果您使用的是Rails 4,我建议您的强大参数不正确 - 但是,当您使用Rails 3时,我猜测您应该这样做:

<%= builder.collection_select("properties_value_id[]", p.property.property_values, :id, :text_value, {:include_blank => false},
                                  {:multiple => true, :size => p.property.property_values.count, :class => 'form-control'}) %>