Извините за длинный пост, обычно не публикуйте здесь часто.Вложенная форма с collection_select и множественным выбором
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 и значения сохранен, кроме значений из коллекции_селек с множественным выбором. Параметры разместить идет что-то вроде этого (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 => 3 является то, что конкретное имущество, что я пытаюсь спасти. Ожидаемый результат - увидеть три новые записи в таблице CompanyProperties с помощью property_id = 3 и значения properties_value_id соответственно. Но этого не происходит. Создается только одна запись с именем property_id = 3, а свойство property_value_id равно 1 (почему ?, нет такого значения).
Плюс Я не могу понять, почему существует пустой параметр здесь «properties_value_id» => ["", "4", "5", "6"]}. Нет такой величины:/
Может ли кто-нибудь помочь достичь ожидаемого результата?
Был ли это когда-либо решались? –
Пустой всегда есть от того, что я нашел, и его можно исправить, добавив reject_if, ссылку на информацию http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html –