2016-03-31 2 views
0

У меня проблема с сохранением модели с вложенными атрибутами. В приложении есть Клиент, которые имеют 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> 

ответ

0
reject_if: lambda {|attributes| attributes['kind'].blank?} 

Никаких признаков :kind в вашей форме или вашим customer_params

Это может иметь какое-то отношение к этому.

Кроме этого, если вам нужны отношения для добавления/удаления контактов, ознакомьтесь с драгоценным камнем cocoon. Если вам нужно только один, а затем построить что в ваши поля для:

<%= f.fields_for :contacts, @customer.contacts.first || @customer.contacts.build do |k| %> 

форма будет быть специфической для одного экземпляра контакта.

Есть способ сохранить экземпляр контакта, получив это: 0 хэш? (Как я этот хэш Это «...: contacts_attribute [0]»?)

Вам не нужно получить к нему доступ, это то, что accepts_nested_attributes для. Остальная часть вашего кода выглядит нормально, поэтому рассмотрите проблему отклонения наверху и вернитесь, если есть проблемы, и опубликуйте вывод журнала - в частности, хеш параметров для запроса!

+0

Эй, Мэтт! Спасибо! В этом была проблема ... Он отлично работает с Клиентом + Контакт, но я не знаю, как объявляется Телефон в Клиенте. У него есть связь * принадлежит_от * с контактом, а не с Клиентом , Как сохранить его с двумя другими? –

+0

@LeandroPonsMalheiros Если он вложен в контакт, вы делаете то же самое, что и для контакта, 'fields_for: phone' и' accepts_nested_attributes' для него в модели контакта. – Matt

+0

@LeandroPonsMalheiros Если это помогло, пожалуйста, примите ответ, чтобы закрыть вопрос. – Matt

Смежные вопросы