У меня есть полиморфные ассоциации с различными моделями, которые я хочу сэкономить при отправке регистрационной формы с помощью разработки. то есть: Пользователь Компания + ContactInfo Сотрудник + ContactInfoRoR multi nesting с полиморфными ассоциациями + разработка
Я понимаю, что гнездовые формы не рекомендуется, но что было бы лучшим способом для достижения этой цели?
Благодаря
модели:
class User < ActiveRecord::Base
belongs_to :company
accepts_nested_attributes_for :company
end
class Company < ActiveRecord::Base
has_many :employees
has_one :contact_info, as: :contactable
accepts_nested_attributes_for :contact_info
end
class Employee < ActiveRecord::Base
belongs_to :company
has_one :contact_info, as: :contactable
accepts_nested_attributes_for :contact_info
end
class ContactInfo < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
end
миграций:
class CreateCompanies < ActiveRecord::Migration
def change
create_table :companies do |t|
t.string :name
t.references :contact_info, index: true
t.string :website
t.timestamps null: false
end
add_foreign_key :companies, :contact_infos
end
end
class CreateEmployees < ActiveRecord::Migration
def change
create_table :employees do |t|
t.string :first_name
t.string :last_name
t.references :company, index: true
t.references :contact_info, index: true
t.string :job_title
t.timestamps null: false
end
add_foreign_key :employees, :contact_infos
end
end
class CreateContactInfos < ActiveRecord::Migration
def change
create_table :contact_infos do |t|
t.string :email
t.string :phone
t.string :mobile
t.string :contactable_type
t.integer :contactable_id
t.timestamps null: false
end
end
end
регистрация контроллер: регистрация нового
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up).push(:name, :email, :password, company_attributes: [ :id, :name, :website, :company_type, :number_of_employees, contact_info_attributes: [ :id, :email, :phone, :mobile]])
end
DEViSE в:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :role => 'form'}) do |f| %>
<%= devise_error_messages! %>
<%= hidden_field_tag 'plan', params[:plan] %>
<% resource.build_company %>
<%= f.fields_for :company do |f| %>
<%= render "companies/fields", f: f %>
<% end %>
<% resource.company.build_contact_info %>
<%= f.fields_for :contact_info do |f| %>
<%= render "contact_infos/fields", f: f %>
<% end %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, :autofocus => true, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
<%= f.submit 'Sign up', :class => 'button right' %>
<% end %>
консоли:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Nb6Na8P93s1dYvlDIQuiG11IoDeSzSylH4BCN8Tm7ipxCsbsdiWjDx5tJpijwldkjK4pPfjuwROnEvybYS7UIQ==", "plan"=>"free", "user"=>{"company_attributes"=>{"name"=>"Company Name", "website"=>"company website", "company_type"=>"company type", "number_of_employees"=>"121"}, "contact_info"=>{"email"=>"[email protected]", "phone"=>"1234", "mobile"=>"1234"}, "name"=>"user_name", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
Unpermitted parameter: contact_info
только для пользователей и компаний PARAMS спасают хорошо. Я пытался заставить devise_parameter_sanitizer работать с nesting contact_info в компании вначале, не пытаясь так же работать с сотрудником, пока не пойму, что я делаю неправильно или какие-нибудь советы, если im на правильном пути?
Спасибо!
Update:
Однако contact_info PARAMS разрешены, если я гнездо формы contact_info поля внутри компании полей формы, как так:
<% resource.build_company %>
<%= f.fields_for :company do |f| %>
<%= render "companies/fields", f: f %>
<% resource.company.build_contact_info %>
<%= f.fields_for :contact_info do |cf| %>
<%= render "contact_infos/fields", f: cf %>
<% end %>
<% end %>
вопрос в том, что хорошая практика?
вы можете расширить «спасают хорошо» (или на самом деле, что это не происходит хорошо), что именно вы наблюдать происходящее, что не работает? Вы получили сообщение об ошибке? Можете ли вы показать нам соответствующие журналы для попытки сохранить? (иногда это проблема разрешения/требует, и журналы сообщают вам, что не разрешено, иногда вы можете видеть, что параметры проходят, как не то, что вы ожидаете) –
@TarynEast Да, вы абсолютно правы, мои плохие. Я добавил параметры из консоли в вопрос. Благодаря! – Shalaby
Я думаю, проблема в том, что у меня нет '' 'accepts_nested_attributes_for: contact_info''' в пользовательской модели, которая, конечно же, не работает, поскольку у нас нет никакой связи между ними. – Shalaby