2013-06-17 3 views
-1

레일을 학습하는 동안 일부 stackoverflow 기능을 모방하려고합니다. Particulary Q에 관심이 있어요 & 질문에 많은 답변 및 댓글이있는 경우 시스템이 질문 및 답변에 속합니다. 그래서 연관과 중첩 된 속성으로 시작했습니다. 중첩 된 속성에 대한 학습 소스는 railcast.com이고 Ryan은 new.html.erb (설문 조사)에 양식 (질문, 답변)을 추가하고 있지만 show.html.erb에 추가하고 싶습니다. 내가 그걸 할 때 나는 뭔가를 게시하지 않는 한 괜찮아 보인다. 처음 답변을 제출 한 후 질문 쇼는 게시 된 응답, 빈 응답 양식 및 텍스트 응답 양식으로 렌더링됩니다. 그래서 전반적으로 저는 답과 두 가지 형태 (하나는 텍스트가 비어 있습니다)를 가지고 있습니다. 답변을 위해 빈 양식 만 렌더링하려면 어떻게해야합니까?fields_for 쇼보기에서 중첩 된 속성

show.html.erb

@question.answers.each do |answer| 
    answer.body 
end 

form_for @question do |f| 
    f.fields_for :answers do |builder| 
    builder.text_area :body 
end 
    f.submit 
end 

question.rb

has_many :answers 
accept_nested_attributes_for :answer 
accept_nested_attributes_for :comment 

answer.rb

belongs_to :question 
accept_nested_attributes_for :comment 

comment.rb

belongs_to :answer 
belongs_to :question 

questions_controller.rb

def show 
@question = Question.find(params[:id]) 
@question.answers.build 
end 
+1

f.fields_for'와'fields_for' 라인을 교체하려고 : 답변, @의 question.answers.build가 할 | 빌더 |' –

답변

0

좋아, 그래서 코드에서 무슨 일이 일어나고 있는지 보자. 첫째, 컨트롤러, 당신은 질문 객체

@question = Question.find(params[:id]) 

을 발견하고 한 새/빈 대답 연결을 구축

@question.answers.build 

그렇게

을 @question에 부착 된 새 응답 객체가 있어야한다

그런 다음보기에서 먼저 디스플레이 기존의 모든 질문에

@question.answers.each do |answer| 
    answer.body 
end 

하고 작품을 좋아 을 다음 당신은 당신이 (@question.answers.build)

왜 컨트롤러 초기화 된 새로운 해답이 될 것으로 예상 무엇을위한 양식을 표시 (지금, 나는 한 동안을 휴식하는 방법을 보여 드리겠습니다) 기존 답변에 대한 양식이 있습니까? Rails가 실제로하는 일은 @question과 관련된 모든 대답을 취하여 각 질문에 대한 양식을 작성하는 것입니다. 그리고, 당신이 하나의 대답을 추가 했으므로 두 가지가 있습니다! 기존 하나는 방금 초기화되었습니다. @question.answers.build

이 코드를 수정하는 방법은 무엇입니까? 데이터베이스에 저장 만 답변을 표시

을 (답변하고 잘못된 일을 저장하려고하면 어떻게되는지 콘텐츠 길이 유효성 검사를 추가하려고) 그리고 형태에 대해 간단하게

을 할

@question.answers.select(&:persisted?).each do |answer| 
    answer.body 
end 

다음을 수행

f.fields_for Answer.new do |builder| 

항상 하나의 답안 양식이 있어야합니다.

2

Michał Szyndel 케이스 레일에서는 대개 특성에 대한 대답을 지정할 수없는 오류가 발생할 수 있습니다.마노하기 Monga 그냥 그렇게 만들기 위해 노력 하자고 제안처럼 :

form_for @question do |f| 
    f.fields_for :answers, @question.answers.build do |builder| 
    builder.text_area :body 
end 
    f.submit 
end