2014-02-25 3 views
0

나는 트랙이있다 has_many 퀴즈와 퀴즈 has_many 질문.중첩 된 리소스를 만들지 않기를 accepts_nested_attributes_?

quiz.rb :

class Quiz < ActiveRecord::Base 
    belongs_to :track 
    has_many :questions, dependent: :destroy 
    accepts_nested_attributes_for :questions 
end 

question.rb :

class Question < ActiveRecord::Base 
    belongs_to :quiz 
end 

quizzes_controller.rb :에

def new 
    @quiz = Quiz.new 
    @track = Track.find(params[:permalink]) 
    @course = Course.find(@track.course_id) 

    3.times { @quiz.questions.build } 
end 

def create 
    @track = Track.find(params[:permalink]) 
    @quiz = @track.quizzes.build(quiz_params) 
    @course = Course.find(@track.course_id) 
    if @quiz.save 
    flash[:success] = 'Quiz successfully created' 
    redirect_to quiz_path @quiz 
    else 
    redirect_to track_path @track 
    end 
end 

private 

def quiz_params 
    params.require(:quiz).permit(:name, :information, :order, 
           :permalink, :user_id, 
           questions_attributes: [:id, :content]) 
end 

PARAMS 제출

{"utf8"=>"✓", 
"authenticity_token"=>"...", 
"quiz"=> { 
    "name"=>"Test Quiz", 
    "questions_attributes"=> { 
    "0"=>{"content"=>"This is question 1?"}, 
    "1"=>{"content"=>"This is question 2?"}, 
    "2"=>{"content"=>""} 
    }, "user_id"=>"1", 
    "order"=>"3" 
}, "commit"=>"Submit", 
"permalink"=>"1-basics"} 

제출을 누르면 퀴즈가 생성되지만 질문은 생성되지 않습니다.

새로운 PARAMS는 : content이 (요청 매개 변수를 고려) 비어있는 경우

reject_if: proc { |q| q['name'].blank? } 

당신은 아마 인스턴스를 거부한다 :

def quiz_params 
    params.require(:quiz).permit(:name, :information, :order, 
           :permalink, :user_id, 
           questions_attributes: [:id, :content, :_destroy, answers_attributes: [:id, :content, :_destroy]]) 
    end 

답변

0

나는 문제가 accepts_nested_attributes_for에 생각

reject_if: proc { |q| q['content'].blank? } 
+0

제거하면 오류가 계속 발생하지 않고 추가되기 전에 오류가 발생했습니다. – Tim

+0

당신의 문제가 빈 이름으로 된 질문을 거절 한 것 같아요. question_attributes : [: id, : content]에 이름을 허용하지 않고 인스턴스가 거부되었습니다. (Tested Rails 4.0.2) . – markets

0

문제가 해결되었습니다. 중첩 된 매개 변수는 중괄호로 묶어야합니다.

def quiz_params 
    params.require(:quiz).permit(:name, :information, :order, 
           :permalink, :user_id, 
           { questions_attributes: [:id, :content] }) 
end 
+0

나는 이것이 원인이라고 생각하지 않지만,'reject_if' 옵션은 공백의 이름 때문에 모든 질문을 거부하고있었습니다. 'name' 속성을 바꾸는 초기화 자나 콜백이 없다면 말입니다. – markets

+0

@markets은 제거 할 때 이미 오류가 발생했다고 이미 말했기 때문에 사용할 수 없습니다. – Tim

+0

다시 시도해 주시겠습니까? 요청 전에 서버를 다시 시작하십시오. 어쨌든 나는'reject_if : proc {| q | q [ 'content']. 공백? }'(또는 일부 모델 유효성 검사). 내가 레일즈 4.0.2에서 테스트를 재현했다. – markets