2013-09-22 9 views
59

私はRyan Bates RailsCast #196: Nested model form part 1に従おうとしています。ライアンズのバージョンには2つの明らかな違いがあります:1)私はビルトインの足場を使用していて、彼が使用しているように気品ではありません.2)私はレール4を使っています(Ryansがキャスト、それは4ではありません)。RoRネストされた属性は、編集時に重複を生成します。

だからここで私は

rails new survey2 
cd survey2 
bundle install 
rails generate scaffold survey name:string 
rake db:migrate 
rails generate model question survey_id:integer content:text 
rake db:migrate 

やったことだそれから私はそう

class Question < ActiveRecord::Base 
    belongs_to :survey 
end 

ので

class Survey < ActiveRecord::Base 
    has_many :questions 
    accepts_nested_attributes_for :questions 
end 

のようなモデルに関連付けを追加それから私は、ネストされたビューの一部

を追加しました

、新たな調査は3つの質問に新しいアンケートを作成し、だから、

class SurveysController < ApplicationController 
    before_action :set_survey, only: [:show, :edit, :update, :destroy] 

    # Standard rails 4 index and show 

    # GET /surveys/new 
    def new 
    @survey = Survey.new 
    3.times { @survey.questions.build } 
    Rails.logger.debug("New method executed") 
    end 

    # GET /surveys/1/edit 
    def edit 
    end 

    # Standard rails 4 create 

    # PATCH/PUT /surveys/1 
    # PATCH/PUT /surveys/1.json 
    def update 
    respond_to do |format| 
     if @survey.update(survey_params) 
     format.html { redirect_to @survey, notice: 'Survey was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # Standard rails 4 destroy 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_survey 
     @survey = Survey.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def survey_params 
     params.require(:survey).permit(:name, questions_attributes: [:content]) 
    end 
end 

をインスタンス化されるたびに3つの質問が作成されているということで結構ですので、最終的にはコントローラ。しかし、調査の1つを編集しようとすると、最初の3つの質問は維持され、さらに3つが作成されます。だからではなく、編集された調査のための3つの質問を有するので、私は今6を持っている私は、コントローラの新しい方法に

Rails.logger.debug("New method executed") 

を追加し、私がやっているとき、私の知る限り、それは実行されません編集操作。誰かが私が間違っていることを教えてもらえますか?

ご協力いただきありがとうございます。

+0

あなたは、編集を追加し、コントローラのコードにアクションを更新することができますか? – Almaron

+0

もちろん!私は何かが簡潔さの祭壇で失われたと思う。 – conciliator

答えて

145

私はそれを理解しました。 survey_paramsメソッドで許可されたパラメータに:idを追加する必要がありました。これは次のようになります。

# Never trust parameters from the scary internet, only allow the white list through. 
def survey_params 
    params.require(:survey).permit(:name, questions_attributes: [:id, :content]) 
end 

これは完全に機能します。私はRoRの初心者ですので、私はこれを塩分で分析してください。しかし、新しいIDは更新アクションに渡される代わりに生成されると思います。これが他の誰かを助けることを願っています。

+1

役立つヒント、ありがとう! (編集:ちょっと言っているのは、ほとんどの人が自分の質問に答えることができないからです。) –

+2

確かに!私は何度も何度も頼りにしてきました。何かを返そうとするのは公正なことです。 :) – conciliator

+1

もRoR初心者はこちら。あなたは私を救った!私はこれらのネストされたフォームに2日間を過ごしました。 – dtc

7

gem on Rails 4を使用すると、編集時に許可されたリストに:idを追加した後も、私はまだ重複フィールドを取得していました。気づい以下同様

Unpermitted parameters: _destroy 
Unpermitted parameters: _destroy 

だから私は許さmodel_attributes:フィールドに:_destroyフィールドを追加し、物事はその後順調に働きました。私たちはそこにエラーをチェックできるように、例えば

...

def survey_params 
    params.require(:survey).permit(:name, questions_attributes: [:id, :content, :_destroy]) 
end 
関連する問題