2013-08-30 6 views
9

railscast #196をRails 4に再現しようとしていますが、いくつかの問題が発生しています。私の例では Rails 4:accepts_nested_attributes_forと質量代入

は、私が電話帳を生成しよう - それぞれの人が複数の電話番号

を持っている可能性を

これらの私のコントローラの重要な部分です:

class PeopleController < ApplicationController 
    def new 
     @person = Person.new 
     3.times{ @person.phones.build } 
    end 

    def create 
     @person = Person.create(person_params) 
     @person.phones.build(params[:person][:phones]) 

     redirect_to people_path 
    end 

private 

    def person_params 
     params.require(:person).permit(:id, :name, phones_attributes: [ :id, :number ]) 
    end 
end 

が、これは私の新しいビューです

<h1>New Person</h1> 

<%= form_for :person, url: people_path do |f| %> 
    <p> 
     <%= f.label :name %> </ br> 
     <%= f.text_field :name %> 
    </p> 

    <%= f.fields_for :phones do |f_num| %> 
     <p> 
      <%= f_num.label :number %> </ br> 
      <%= f_num.text_field :number %> 
     </p> 
    <% end %> 

    <p> 
     <%= f.submit %> 
    </p> 
<% end %> 

私の個人モデルにはhas_many :phonesaccepts_nested_attributes_for :phones、電話機モデルにはbelongs_to :personがあります。

私は次の問題があります。

  1. の代わりに3私はエラーを取得するフォーム送信するとちょうど1新しいフォーム
  2. であり、電話番号はフィールド:

ActiveModel::ForbiddenAttributesError

ラインで

@person.phones.build(params[:person][:phones]) 
個の

パラメータ:原則として

{"utf8"=>"✓", 
"authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=", 
"person"=>{"name"=>"the_name", 
"phones"=>{"number"=>"12345"}}, 
"commit"=>"Save Person"} 

私は、フォームオブジェクトとして、この全体のことをやりたいが、私は私もaccepts_nested_attributesでそれを取得しない場合、私は、フォームとしてそれを行うにはチャンスがあるんだと思いますオブジェクト:(

答えて

11

を次のように(あなたがここで構築したオブジェクトを使用したい)form_for :personform_for @personにビューチェンジで3台の電話機を得るために:

<%= form_for @person, url: people_path do |f| %> 

このようForbiddenAttributesエラーを修正する必要がありますよく

そして、あなたのcreateアクションは次のようになります。

def create 
    @person = Person.create(person_params) 

    redirect_to people_path 
end 

更新:

<%= form_for :person do |f| %>Personモデルの一般的なフォームを作成し、特定のオブジェクト(に適用される追加的な詳細を認識していませんあなたのnewアクションでは@person)。 @personオブジェクトに3つのphonesを添付しました。@personは、:personと同じではありません。これは、ビューに3つの電話フィールドが表示されなかった理由です。詳細はhttp://apidock.com/rails/ActionView/Helpers/FormHelper/form_forを参照してください。

+0

yay!それは両方の問題を解決しました - 私がどれほどうれしいか言うことはできません!基本的なレールチュートリアルでは、ハッシュを使用しています:http://guides.rubyonrails.org/getting_started.html#the-first-form - 違いを詳しく説明できますか? – speendo

+1

@speendo、あなたはシンボル対オブジェクトの使用の違いを意味する場合は、更新を参照してください。 – vee

+0

はい、それを指摘してくれてありがとう! – speendo

関連する問題