0

ユーザーに自分の投稿にコメントしてもらう方法を作成しようとしています。現在、すべてのユーザー投稿がホームページに表示され、ユーザープロファイルには現在のユーザー投稿のみが表示されます。コメントがユーザープロファイルの投稿にのみ表示されるようにしたいと思います。ユーザープロファイルにコメントフォームを追加しようとしましたが、nil:NilClassエラーに対して未定義のメソッド`comments'が表示されました。

私のcomments_controllerは次のようになります

class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
end

ユーザープロファイルにレンダリングしている部分的な(_comment_form.html.erb)があります。

<h2>Add a comment:</h2>
<%= form_for ([@post, @post.comments.build]) do |f| %>
   <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
   </div>
   <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
   </div>
   <div class="actions">
    <%= f.submit %>
   </div>
<% end %>

私のコメントモデルは次のようになります

class Comment < ActiveRecord::Base
  belongs_to :post
end

私の投稿モデルは次のようになります

class Post < ActiveRecord::Base
 attr_accessible :content

 belongs_to :user

 validates :content, :presence => true
 validates :user_id, :presence => true
 validates :user, :presence => true
 validates :title, :presence => true

 has_many :comments

 default_scope :order => 'posts.created_at DESC'
end

私のユーザープロファイルはshow.html.erbのように見えます

<table class="profile" summary="Profile information">
  <tr>
    <td class="main">
    <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
    </h1>
    <% unless @user.posts.empty? %>
        <table class="posts" summary="User posts">
            <%= render @posts %>
            <%= render 'comments/comment_form' %>
        </table>    
    <% end %>
    </td>
    <td class="sidebar round">
  <strong>Name</strong> <%= @user.name %><br />
  <strong>URL</strong>  <%= link_to user_path(@user), @user %><br />
  <strong>Tasks</strong> <%= @user.posts.count %>
    </td>
  </tr>
</table>
4

5 に答える 5

2
@post = Post.find_by_id(params[:post_id])
于 2012-11-09T09:52:24.723 に答える
2

コントローラのメソッドで初期化@postされておらず、として使用されている可能性があります。実用的な場合は、常に新しいフォームの空のモデルを作成してください。newnil

def new
  @post = Post.new(params[:post])
end
于 2011-08-09T18:06:18.433 に答える
1

PostsController の show アクションで @post を初期化していますか? CommentsController の create アクションからリダイレクトしているため、これが必要になります。

于 2011-08-09T18:27:02.687 に答える
1
<%= render @posts %>

この行は、代わりに @post を参照する必要があります。コード内の他のすべての参照と比較して、末尾の s に注意してください。

于 2012-11-01T12:50:52.813 に答える
0

log/development.logエラーが発生した場所を確認できますか? 質問からはわかりませんでした。しかし、コードから判断すると、次の 2 つの場所が考えられます。

  1. @comment = @post.comments.create(params[:comment])が見つからない場合にPost.find発生する コードの最後の行はRecordNotFoundid

  2. <%= form_for ([@post, @post.comments.build]) do |f| %>

これは非常に可能性が高いです。development.log を実行して、puts @post.inspectnull かどうかを確認できますか。それがnullであると仮定すると、Postレンダリングした場所にオブジェクトをインスタンス化する必要があります_comment_form.html.erb

于 2011-08-09T20:41:44.163 に答える