неопределенный метод `комментарии' для nil:NilClass

Я пытаюсь создать способ, чтобы пользователи комментировали мои сообщения. В настоящее время у меня есть все сообщения пользователей, отображаемые на моей домашней странице, а затем в профиле пользователя только сообщения текущих пользователей. Хотелось бы, чтобы комментарии появлялись только к постам в профиле пользователей. Я попытался добавить форму комментария в профиль пользователя, но получил неопределенный метод «комментарии» для ошибки nil:NilClass.

Мой comment_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

Моя модель Post выглядит так

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>

person Michael Peralta    schedule 09.08.2011    source источник


Ответы (5)


Возможно, вы не инициализировали @post в методе new вашего контроллера, и он используется как nil. Всегда создавайте пустую модель для новой формы, если это целесообразно:

def new
  @post = Post.new(params[:post])
end
person tadman    schedule 09.08.2011

Вы инициализируете @post в действии show вашего PostsController? Это потребуется, потому что вы перенаправляете действие создания вашего CommentController.

person Moiz Raja    schedule 09.08.2011
comment
Да, я пытался сделать это, и все же это ничего не изменило, если только я не сделал это неправильно. Я сделал def show (at)post = Post.find(params[:post]) (at)comments = (at)post.comments end - person Michael Peralta; 09.08.2011
comment
Вы добавили обработчик действия show в свой PostsController или CommentController? Вам нужно добавить обработчик действий в PostsController (если он у вас есть) - person Moiz Raja; 10.08.2011

<%= render @posts %>

Вместо этого эта строка должна ссылаться на @post. Обратите внимание на конечный s по сравнению со всеми другими ссылками на него в вашем коде.

person Oscar Barrett    schedule 01.11.2012

Вы видите 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, чтобы увидеть, является ли он нулевым. Предполагая, что он равен нулю, вам нужно создать экземпляр объекта Post везде, где вы визуализировали _comment_form.html.erb

person Dafeng    schedule 09.08.2011

person    schedule
comment
Добро пожаловать в Stack Overflow! Всегда предоставляйте пояснения к коду, который вы публикуете, так как это потребуется для дальнейшего использования. - person Unni Kris; 09.11.2012