2014-11-16 4 views
1

나는 user-> posts-> comments 연관을 만들지 만, 코멘트는 올바르게 작동하지 않는다. 나는 포스트에 주석을 달았을 때, 데이터베이스에 주석을 저장하고, user_id 열은 기록했지만 (ok), column post_id 비었다.왜 코멘트가 작동하지 않는가

부분 _post_list.html.erb있다 _comment.html.erb 부분이있다

<% @posts.each do |post| %> 
    <tr> 
     <td><%= post.title %></td> 
     <td><%= post.content %></td> 
     <%= render 'shared/comment' %> 
     <%= post.user.name %> 
     </tr></br></br> 
     <% end %> 

<%= form_for(@comment) do |f| %> 
<%= f.text_area :body %><br><br> 
<%= f.submit "commented" %> 
<% end %> 

서버 로그

class CommentsController < ApplicationController 
    def new 
     @comment = Comment.new 
    end 

    def create 
     @comment = current_user.comments.build(comment_params) 
     if @comment.save 
      redirect_to root_url 
     else 
      render 'static_pages/home' 
     end 
    end 

    private 

    def comment_params 
     params.require(:comment).permit(:body) 
    end 
end 

UPD있다 comments_controller 제어기

Started POST "/posts/6/comments" for 127.0.0.1 at 2014-11-16 23:28:26 +0300 
Processing by CommentsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZvyHKxSdH0a1rf79yaWmo9N/pD9/YhSQ9Ek8bdMLhOI=", "comment"=>{"body"=>"stackoverflow"}, "commit"=>"commented", "post_id"=>"6"} 
    User Load (4.9ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'b52623cb00671708536fce96c310b5d365128880' LIMIT 1 
    (0.2ms) begin transaction 
    SQL (0.6ms) INSERT INTO "comments" ("body", "created_at", "updated_at", "user_id") VALUES (?, ?, ?, ?) [["body", "stackoverflow"], ["created_at", "2014-11-16 20:28:26.544500"], ["updated_at", "2014-11-16 20:28:26.544500"], ["user_id", 5]] 
    (131.7ms) commit transaction 
Redirected to http://localhost:3000/ 
Completed 302 Found in 152ms (ActiveRecord: 137.4ms) 


Started GET "/" for 127.0.0.1 at 2014-11-16 23:28:26 +0300 
Processing by StaticPagesController#home as HTML 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'b52623cb00671708536fce96c310b5d365128880' LIMIT 1 
    Rendered shared/_post_form.html.erb (2.4ms) 
    Post Load (0.4ms) SELECT "posts".* FROM "posts" ORDER BY created_at DESC 
    Rendered shared/_comment.html.erb (1.8ms) 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 5]] 
    Rendered shared/_comment.html.erb (2.8ms) 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
    Rendered shared/_comment.html.erb (4.0ms) 
    CACHE (3.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
    Rendered shared/_comment.html.erb (1.5ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
    Rendered shared/_comment.html.erb (2.9ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
    Rendered shared/_post_list.html.erb (45.3ms) 
    Rendered static_pages/home.html.erb within layouts/application (52.1ms) 
    Rendered layouts/_header.html.erb (1.2ms) 
Completed 200 OK in 364ms (Views: 347.0ms | ActiveRecord: 4.5ms) 

클래스 StaticPagesController <와 ApplicationController 데프 지수 끝

def show 
    end 

    def home 
    @post = current_user.posts.build 
    if signed_in? 
    end 
    @posts = Post.all 
    @comment = current_user.comments.build 
    end 

end 

보기 home.html.erb이

<%= render 'shared/post_form' %> 
<%= render 'shared/post_list' %> 

어떻게 해결 static_pages_controller 컨트롤러? 내 나쁜 영어로 죄송합니다.

+0

컨트롤러 코드를 게시 할 수 있습니까? 그것이 속한'@ post'를'@ comment'라고 말하지 않습니다. 컨트롤러를 게시하면 무엇을 변경해야하는지 알려줄 수 있습니다. –

+0

comments_controller 또는 posts_controller? – vveare138

+0

개의 댓글이 생성 동작이있는 것으로 가정하고 –

답변

0

모든 게시물을 반복하고 각각에 대해 동일한 페이지에 의견 양식을 만드는 것처럼 보입니다. 게시물 경로 내에서 배치하여 주석 경로를 중첩 된 자원으로 설정하고자 할 수 있습니다.

# config/routes.rb 
resources :posts do 
  resources :comments 
end 

은과 같이 부분으로 @post 객체를 전달합니다

<%= render 'shared/comment', post: post %> 

는 그런 다음과 같이 의견 양식을 만들 수있을 것입니다 :

<%= form_for([post,@comment]) do |f| %> 
<%= f.text_area :body %><br><br> 
<%= f.submit "commented" %> 
<% end %> 

을 그 post을 포함하여, 그 게시물이 속한 코멘트를 말하고 있습니다. 컨트롤러를 사용할 경우 강력한 매개 변수를 업데이트하는 것을 잊지 마십시오.

편집 : 업데이트를 기반으로 컨트롤러 하단에 :post_id을 (를) 추가해야합니다.

+0

보기 및 컨트롤러를 편집했지만 오류가 표시됨 경로가 일치하지 않음 {: action => "index", : controller => "comments", : format => nil, : post_id => # : post_id] – vveare138

+0

필자는 'post' 변수를 포함하도록 내 대답을 업데이트했습니다. 부분적으로 form_for에서'@'를 제거하십시오. @post가 기본적으로 존재하지 않기 때문에이 변수를 전달해야했습니다. 하지만 왜 인덱스 #를 치려고했는지 모르겠습니다. 양식을 제출하기 전후에 그 사실을 알았습니까? –

+0

질문 업데이트 – vveare138

1

무슨 일이 일어날 지 이해할 수 있도록 충분한 코드가 표시되지 않았습니다. 하지만 양식에 post.id에 대한 참조가 포함되어 있지 않거나 게시물 개체의 식별자 이름을 지정하지 않은 것이 이상합니다.

  • 입력 필드 (여기에 코멘트의 텍스트) 형태
  • 세션에 저장된 값 (사용자 ID)

현재 게시물 만일의 :

컨트롤러에서만 사용할 수 있습니다 ID는 세션 필드가 아닌 양식 필드에 있으며 컨트롤러는 ID를 가져 오지 않으므로 데이터베이스에 저장할 수 없습니다.

관련 문제