0

У меня есть полиморфные ассоциации с различными моделями, которые я хочу сэкономить при отправке регистрационной формы с помощью разработки. то есть: Пользователь Компания + 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 %> 

вопрос в том, что хорошая практика?

+0

вы можете расширить «спасают хорошо» (или на самом деле, что это не происходит хорошо), что именно вы наблюдать происходящее, что не работает? Вы получили сообщение об ошибке? Можете ли вы показать нам соответствующие журналы для попытки сохранить? (иногда это проблема разрешения/требует, и журналы сообщают вам, что не разрешено, иногда вы можете видеть, что параметры проходят, как не то, что вы ожидаете) –

+0

@TarynEast Да, вы абсолютно правы, мои плохие. Я добавил параметры из консоли в вопрос. Благодаря! – Shalaby

+0

Я думаю, проблема в том, что у меня нет '' 'accepts_nested_attributes_for: contact_info''' в пользовательской модели, которая, конечно же, не работает, поскольку у нас нет никакой связи между ними. – Shalaby

ответ

0

Это догадка - но ваш контакт_инфо для компании не вложен в раздел компании. Попробуйте что-то вроде этого (обратите внимание, не тестируется, вероятно, багги)

<%= 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 %> 

    <%# this is now nested inside the company-fields %> 
    <% resource.company.build_contact_info %> 
    <%= f.fields_for :contact_info do |f| %> 
    <%= render "contact_infos/fields", f: f %> 
    <% end %> 

<% 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' %> 
Смежные вопросы