Я искал и искал, но ничего не пришло, поэтому мне нужно попросить вас о помощи.Я должен создать регистрационную форму с полями вложенности с отдельными таблицами в базе данных для пользователя, компании и адреса.Структура полей ниже (имена столбцов в db приведены ниже):
User(new model)
-first name
-email
Address(nested in User)
-street
-city
Company(nested in User)
- name
- Address(nested in user.company)
-street
-city
Дело в том, что когда я пытаюсь сохранить отправку формы в базу данных, у меня появляется ошибка unknown attribute 'company_name' for Company
.Это показывает, что моя модель имеет атрибут name
вместо company_name
, и это правда, но как связать их для company_name, которое отражено в столбце: name в таблице компании?Я думаю, что я должен сопоставить свои параметры, но как это сделать?
Я связал их с полиморфными ассоциациями, мои модели:
class User < ApplicationRecord
has_one :address, as: :addressable
has_one :company
accepts_nested_attributes_for :address
end
class Address < ApplicationRecord
belongs_to :addressable, polymorphic: true
end
class Company < ApplicationRecord
belongs_to :user
has_one :address, as: :addressable
accepts_nested_attributes_for :address
end
Мой контроллер регистрации
def create
@registration = Registration.new(registration_params)
end
private
def registration_params
params.require(:registration).permit(
:first_name, :email,
:street, :city,
:company_street, :company_city
)
end
формы / registration.rb
class Registration
include ActiveModel::Model
attr_accessor :first_name, :email,
:street, :city,
:company_street, :company_city
attr_reader :params
def address_params
params.slice(:street, :city, :zip_code, :country)
end
def create_company
company.save(company_params)
end
def create_company_address
company.create_address(company_address_params)
end
private
def company_params
params.slice(:company_name)
end
def company_address_params
params.slice(:company_street, :company_city)
end
РЕДАКТИРОВАТЬ: отсутствует представление:
<%= simple_form_for(@registration, url: registration_path(resource_name)) do |f| %>
<%= f.input :email, autofocus: true, autocomplete: "email", class: "form-control" %>
<%= f.input :first_name, class: "form-control" %>
<%= f.input :street %>
<%= f.input :city %>
<%= f.input :zip_code %>
<hr>
<h3>Company details</h3>
<%= f.input :company_name %>
<%= f.input :company_street %>
<%= f.input :company_city %>
<% end %>