很抱歉很长的帖子,通常不经常在这里发帖。
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”]}。没有这样的价值:/
任何人都可以帮助达到我预期的结果吗?
答案 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'}) %>