2016-03-31 23 views
0

ネストされた属性でモデルの保存に問題があります。 アプリには、の顧客があります.1.n の連絡先の魔女には、1. の電話機があります。ネストされた属性子モデルは保存されません

ここで質問する前に多くを検索し、の連絡先のみを保存することにしました。最初はの顧客が保存されていますが、の連絡先は保存されていません。私はを繰り返す必要はありません読んだから...を作成し、ライン「@customer = Customer.new(customer_params)」を作成することを新しい機能からをcontacts.build両方を保存します。

なぜ機能しないのですか? (これは最初の質問です。)いくつかの修正とデバッグの後

、私は私が(... contacts.build(customer_params [:contacts_attributes]))のセカンドラインの建物の連絡先を設定するとことが判明し、それが保存されていません「不明な属性」のエラーが原因です。これはhash:contacts_attributeとその内容の間に ':0'(?)という別のハッシュが追加されたためです。形から来ているハッシュの構造はこれです:

":contacts_attributeの[:0 [:名:部署:電子メール]]":0

私は、このハッシュを想像しますハッシュに来る複数の問い合わせインスタンスを、追加するためのものです:1、:0ハッシュ:2など

これを取得することにより、連絡先インスタンスを保存する方法はありますか?

以下は関連するコードです:(?は、私は、このハッシュにアクセスするにはどうすればよいことが"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。RB

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 gemをご覧ください。あなただけが必要な場合は、あなたのフィールドにそれを作成してください:

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

フォームは連絡先の1つのインスタンスに固有のものになります。

Contactインスタンスを保存する方法は次のとおりです。0 hash? (私は、このハッシュにアクセスするにはどうすればよいそれは「...:contacts_attribute [0]」?)

あなたがそれにアクセスする必要はありません、それはaccepts_nested_attributesが何のためにあるのかです。あなたのコードの残りの部分は大丈夫ですので、拒否の問題を一番上に整理し、問題がまだ残っていれば復帰し、ログ出力を投稿してください。特にリクエストのparamsハッシュ!

+0

ちょっと、マット!ありがとうございました! これは問題でした...カスタマー+連絡先とは完全に連携していますが、電話機が顧客内でどのように宣言されているかはわかりません。顧客とではなく連絡先との関連付けがあります。他の2つと一緒に保存するにはどうしたらいいですか? –

+0

@LeandroPonsMalheiros連絡先の下にネストされている場合は、連絡先モデルの場合と全く同じ操作を行います。連絡先モデルの場合は、fields_for:telephoneとaccepts_nested_attributesです。 – Matt

+0

@LeandroPonsMalheirosこれが助けになったら、答えを受け入れて質問を閉じる。 – Matt

関連する問題