У меня проблема с сохранением модели с вложенными атрибутами. В приложении есть Клиент, которые имеют 1..n Контакты Ведьма в свою очередь имеет 1..n Телефоны.Вложенные атрибуты Детская модель не сохраняет
Я много искал, прежде чем спрашивать здесь, и решил сохранить его только в первую очередь. Контакт. Ну, сначала Клиент сохранен, но Контакт нет. Из того, что я прочитал, что нет никакой необходимости повторять ... contacts.build из новой функции в создать, и что линии «@customer = Customer.new (customer_params)» бы создать и сохраните их обоих.
Почему это не работает? (Это первый вопрос.)
После некоторых изменений и отладки, я обнаружил, что, когда я установил второй линии застройки Контакт (... contacts.build (customer_params [: contacts_attributes])) это не сохраняется из-за ошибки «неизвестного атрибута». Это связано с тем, что между хэшем: contacts_attribute и его содержимым добавлен еще один хэш, называемый ': 0' (?). Структура хэш, который приходит из формы заключается в следующем:
": contacts_attribute [: 0 [: имя,: отдел,: по электронной почте]]"
Я полагаю, что этот хэш: 0 для добавления более одного Контакта экземпляра, который придет в хэш: 1,: 2 и т.д.
Там есть способ хранения Контакта экземпляра , получив это: 0 хэша? (Как получить доступ к этой хэш Это "...: contacts_attribute [0]"?)
Ниже приведен соответствующий код. Спасибо за внимание!
customer.rb
class Customer < ActiveRecord::Base
...
has_many :contacts
accepts_nested_attributes_for :contacts, reject_if: lambda {|attributes| attributes['kind'].blank?}
...
def change_by(user_id)
update_attributes(changed_by: user_id, deleted_at: Time.now, updated_at: Time.now)
end
def delete(user_id)
update_attributes(status: false, changed_by: user_id, deleted_at: Time.now, updated_at: Time.now)
end
private
...
end
customers_controller.гь
class CustomersController < ApplicationController
def new
@customer = Customer.new
@customer.contacts.new
end
def create
user_id = session[:user_id]
@customer = Customer.new(customer_params)
if @customer.save
@customer.change_by(user_id)
flash[:success] = "Cliente cadastrado com sucesso!"
redirect_to customers_url
else
render 'new'
end
end
private
def customer_params
params.require(:customer).permit(:razao_social, :nome, :CPF_CNPJ,
:adress_id, :email_nota, :transporter_id, :observacao,
contacts_attributes: [:nome, :setor, :email])
end
Форма
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for @customer do |f| %>
<%= f.label "Dados Básicos" %>
<div class="well">
<%= f.label :razao_social, "Razão Social" %>
<%= f.text_field :razao_social %>
<%= f.label :nome, "Nome" %>
<%= f.text_field :nome %>
<%= f.label :CPF_CNPJ, "CPF/CNPJ" %>
<%= f.text_field :CPF_CNPJ %>
<%= f.label :email_nota, "Email para nota" %>
<%= f.email_field :email_nota %>
<%= f.label :observacao, "Observações" %>
<%= f.text_area :observacao %>
</div>
<%= f.fields_for :contacts do |k| %>
<%= k.label "Contato" %>
<div class="well">
<%= k.label :nome, "Nome" %>
<%= k.text_field :nome %>
<%= k.label :setor, "Setor" %>
<%= k.text_field :setor %>
<%= k.label :email, "Email" %>
<%= k.email_field :email %>
</div>
<% end %>
<%= f.submit "Cadastrar Cliente", class: "btn btn-primary" %>
<% end %>
</div>
Эй, Мэтт! Спасибо! В этом была проблема ... Он отлично работает с Клиентом + Контакт, но я не знаю, как объявляется Телефон в Клиенте. У него есть связь * принадлежит_от * с контактом, а не с Клиентом , Как сохранить его с двумя другими? –
@LeandroPonsMalheiros Если он вложен в контакт, вы делаете то же самое, что и для контакта, 'fields_for: phone' и' accepts_nested_attributes' для него в модели контакта. – Matt
@LeandroPonsMalheiros Если это помогло, пожалуйста, примите ответ, чтобы закрыть вопрос. – Matt