2011-08-09 51 views
0

我試圖創建一種讓用戶評論我的帖子的方法。目前,我的所有用戶信息都顯示在我的主頁上,然後在用戶個人信息中只顯示當前用戶信息。我希望獲得該評論,以便評論僅顯示在用戶個人資料的帖子中。我試圖在用戶配置文件中添加註釋表單,但是我得到了一個未定義的方法`註釋'爲nil:NilClass錯誤。未定義的方法`評論'爲零:NilClass

我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> 

回答

2

這可能是你有沒有在你的控制器的new方法初始化@post並且它被用作nil。如果它是實用的,請始終爲您的新表單構建一個空模型:

def new 
    @post = Post.new(params[:post]) 
end 
+0

試過,仍然出現同樣的錯誤。 –

1

您是否正在初始化您的PostsController的show動作中的@post?這將是必需的,因爲您正在從您的CommentsController的創建操作重定向。

+0

是的,我試過這樣做,除非我做錯了,否則它不會改變任何東西。我做了def show (at)post = Post.find(params [:post]) (at)comments =(at)post.comments end –

+0

您是否在您的PostsController或CommentsController中添加了show動作處理程序?您需要在PostsController中添加操作處理程序(如果有的話) –

0

您能看到log/development.log以查看發生錯誤的位置嗎?這個問題並不清楚。但是從你的代碼來看,有兩種可能的位置:

  1. @comment = @post.comments.create(params[:comment]) 這裏是不可能的,因爲代碼的最後一行是Post.find這將提高一個RecordNotFound如果沒有找到id

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

這是非常有可能的,你可以做一個puts @post.inspect並檢查你的development.log,看看是否是nu二。假設它爲空,你需要實例化一個對象Post無論你呈現_comment_form.html.erb

1
<%= render @posts %> 

此行應引用@post代替。請注意尾部的s,與代碼中的所有其他引用相比較。

2
@post = Post.find_by_id(params[:post_id]) 
+2

歡迎使用堆棧溢出!請務必向您發佈的代碼提供解釋,因爲這將是將來需要參考的。 –

相關問題