0

Извините за длинный пост, обычно не публикуйте здесь часто.Вложенная форма с 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"]}. Нет такой величины:/

Может ли кто-нибудь помочь достичь ожидаемого результата?

+0

Был ли это когда-либо решались? –

+0

Пустой всегда есть от того, что я нашел, и его можно исправить, добавив reject_if, ссылку на информацию http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html –

ответ

0

Это должен быть комментарием, но я выложу здесь, чтобы сохранить его для чтения:


Заготовка пар, вероятно, будет «селектор»/«по умолчанию» значение в вашем поле выбора. В противном случае, есть ли способ увидеть, как ваш HTML-элемент может включать отдельный элемент в property_value_ids?

Если вы используете Rails 4, я рекомендовал бы ваш сильный PARAMS был неверны - однако, как вы используете 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'}) %> 
Смежные вопросы