2012-02-13 1 views
1

블로그 항목 하단에 의견 양식을 작성하고 싶습니다. 문제는 blog_id를 저장하지 않기 때문에 주석이 작성되는 동안 blog_id가 지정되지 않는다는 것입니다. 나는이 줄을 갖는 것으로 생각했다 :rails nested_attribute

@new_comment = @blog.comments.build(params[:comment]) 

그것이 효과가 있지만 그렇게되지는 않을 것이라고 생각했다. 이것은 내가 무엇을 가지고 :

블로그 # 보여

def show 
@blog = Blog.find(params[:id]) 
@new_comment = @blog.comments.build(params[:comment]) 
end 

블로그 # 양식

... 
<%= semantic_form_for @new_comment do |f| %> 
    <%= f.input :name %> 
    <%= f.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %> 
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div> 
<% end %> 

blog.rb

accepts_nested_attributes_for :comments 

의견 컨트롤러

def create 
@comment = @blog.comments.build(params[:comment]) 
if @comment.save 
    redirect_back_or show_blog_path(@blog) 
else 
    redirect_to show_blog_path(@blog) 
end 
end 

편집 :하지만 지금은 후,

@blog = Blog.find(params[:id]) 
@blog.comments.build 
@comments = Comment.where(:blog_id => @blog.id) 

모든 것이 잘 작동 :

나는 수행하여 @blog 내부의 양식을 중첩 :

<%= semantic_form_for @blog do |f| %> 
<%= f.semantic_fields_for :comments do |ff| %> 
    <%= ff.input :name %> 
    <%= ff.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %> 
<% end %>  
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div> 
<% end %> 

및 #가 보여주는 블로그를 변경 나는 코멘트를 제출하고, 코멘트는 두 번 나타난다. 그것은 그것이 예정되어있는 주석 섹션에 나타나며 새로운 코멘트 양식 위에 미리 채워진 주석 양식으로 표시됩니다. 따라서 블로그의 내용, 방금 제출 한 미리 작성된 주석 양식, 새 주석 양식 및 주석 표시 섹션의 주석이 표시됩니다.

나는 그것이 무엇인지 모른다.

답변

1

양식에서 상위 개체를 참조하지 않습니다. 예, 현재 @blog을 참조하는 @new_comment을 초기화했지만 주석 형식에서이를 지정하지 않았습니다. 주석 컨트롤러의 동작을 만들기 위해 전달 된 매개 변수를 검사하면 bold_id이 전달되지 않을 가능성이 큽니다.

시도 코멘트 양식에

f.hidden :blog 

을하고. 당신과 같은 숨겨진 필드를하지 않으려면, 당신은

semantic_form_for [@blog, @new_comment] do |f| 

그러나 같은 중첩 된 형태를 가질 수있다

또는은,이 의견은 아래에 중첩 할 수 있도록 경로를 가지고 당신의 루트 파일이 필요합니다 블로그, 같은 뭔가 폼의 게시물 blog_comments_path 지시대로

resources :blogs do 
    resources :comments, :only => [:create] 
end 

이가 필요합니다 (지금은 행동을 만들에만 걸릴 수 있습니다).

희망이 도움이됩니다.

편집 :이 내가 그것을 구현 (YMMV를, 그래서 귀하의 요구에 만족하는 경우, 명확하게하시기 바랍니다) 제안하는 방법입니다 -

blogs#show 등 :

@blog = Blog.find(params[:id]) 
@now_comment = @blog.comments.build 
@comments = @blog.comments # existing comments u might wanna show below the post 

양식 등을 :

= semantic_form_for [@blog, @new_comment] do |f| 
    # input for name and content 

위의 그림과 같이 중첩 된 경로

comments#create 다음과 같이 : (blog_id도 params로 전달됩니다. 따라서 블로그를 찾고 해당 블로그의 주석 매개 변수를 기반으로 설명을 작성한 다음 저장하십시오.

@blog = Blog.find(params[:blog_id]) 
@comment = @blog.comments.new(params[:comment]) 
@comment.save 
+0

숨겨진 필드를 추가하고 싶지 않습니다. 나는 익숙한 방식으로 양식을 중첩했다. (내가하는 방식과 당신이하는 방식이 어떻게 다른지 확실하지 않습니다.) 하지만 위의 편집에서 위의 새로운 문제를 참조하십시오. 감사. – noob

+0

미리 채워진 주석 형식은 @comments 변수 때문입니다. 'semantic_fields_for '는 기본적으로 모든 주석 (즉, 블로그의 기존 주석과 @ blog.comments.build 행에 의해 인스턴스화 된 새로운 주석)에 루프를 수행하고 각각을 양식에 표시합니다. – prasvin

+0

p.s. : 위의 (편집 후) 제대로 작동합니까? 양식은'@ blog'에 대한 semantic_form_for를 가지며 주석의 각각에 대해 중첩 된 속성을 허용합니다. 이제 주석 제어기의 작업을 만들기 위해 양식이 제출됩니다. 이 양식은 이제'@ blog'에 대한 편집 양식으로 작동하므로 블로그 컨트롤러의 업데이트 작업에 제출하십시오. 코멘트가 생성되는 곳입니다 (또는 블로그가 업데이트되어 블로그가 중첩 된 속성을 받아들이므로 주석을 생성합니다). – prasvin