Объект формы Rails не обновляет базу данных с полиморфной ассоциацией - PullRequest
0 голосов
/ 27 ноября 2018

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

1 Ответ

0 голосов
/ 27 ноября 2018

Я бы порекомендовал вам прочитать о том, как accepts_nested_attributes_for работает, и о помощнике формы fields_for.

. Например, для компании с адресами вы должны использовать accepts_nested_attributes_for и для компании.на модели пользователя и форма должна быть что-то вроде:

<h3>Company details</h3>
<%= f.simple_fields_for :company, Company.new do |ff| %>
  <%= ff.input :name %>
  <%= ff.simple_fields_for :address, Address.new do |fff| %>
    <%= fff.input :street %>
    <%= fff.input :city %>
  <% end %>
<% end %>

Тогда параметры:

def user_params
  params.require(:user).permit(:email, company_attributes: [:name, address_attributes: [:street, :city])
end

Я действительно рекомендую вам прочитать о вложенных формах, метод fields_for иaccepts_nested_attributes_for конфигурации на моделях (а также на StrongParameters), это будет иметь гораздо больше смысла для моего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...