在 partials 中定义用户

Defining users within partials

我是 rails 上 ruby 的新手,我知道这是初学者的错误。我正在尝试创建一个在 post 内显示用户评论的应用程序。我有一条评论部分指向我的 post#show,当请求显示 <%= image_tag(comment.user.avatar.small.url, class: "media-object") if comment.user.avatar? %> 从 _comment.html.erb,我得到“nil:NilClass 的未定义方法 'user'”。我读过关于 Whosebug 的其他问题,我知道这是说它找不到与post 在评论中,我需要在我的控制器中定义用户。我假设它是针对 post 控制器的,但我似乎无法理解具体的语法来显示评论post 中的用户。

#comments_controller
def create
 @topic = Topic.find(params[:topic_id])
 @post = Post.find(params[:post_id])
 @comment = current_user.comments.new(comment_params)
 @comment.post = @post
 @comment.save
 authorize @comment
 redirect_to [@topic, @post]
end

#posts_controller
def show
 @topic = Topic.find(params[:topic_id])
 @post = Post.find(params[:id]) 
end

#post model
class Post < ActiveRecord::Base
 belongs_to :user
 belongs_to :topic
 has_one :summary
 has_many :comments
 mount_uploader :image, ImageUploader

#comment model
 class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user

#rendering comment partial in post#show
 <h1><%= @post.markdown_title %></h1>
 <div class="row">
  <div class="col-md-8">
   <small>
    <%= image_tag(@post.image.thumb.url) if @post.image? %></br>
    <%= image_tag(@post.user.avatar.tiny.url) if @post.user.avatar? %>
  submitted <%= time_ago_in_words(@post.created_at) %> ago by
   <%= @post.user.name %>
  </small>
  <p><%= @post.markdown_body %></p>
 </div>

<div class="col-md-4">
 <% if policy(@post).edit? %>
  <%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %> 
<% end %>
<% if policy(@post).destroy? %>
  <%= link_to "Delete Post", [@topic, @post], method: :delete, class: 'btn btn-danger', data: { confirm: "Are you sure you want to delete this post?" }  %>
  <% end %>
</div>

<div class="col-md-8">
 <% if policy(Comment.new).create? %>
   <%= render partial: 'comments/comment', locals: { comment: @comment } %>
   <%= render partial: 'comments/form', locals: {topic: @topic, post: @post} %>
<% else %>
  <h3>Sign up to Bloccit to post comments</h3>
  <%= link_to "Sign up", new_user_registration_path, class: 'btn btn-primary' %></br></br>
<% end %>

#comment partial
 <ul>
 <% @post.comments.each do |c| %>
  <div class="media">
   <div class="media-left">
    <%= image_tag(comment.user.avatar.small.url, class: "media-object") if comment.user.avatar? %>
   </div>
   <div class="media-body">
    <small>
     <%= comment.user.name %> commented <%= time_ago_in_words(comment.created_at) %> ago
  <% if policy(comment).destroy? %>
    | <%= link_to "Delete", [@topic, @post, comment], method: :delete %>
   <% end %>
   </small>
 <li>
  <p><%= c.body %></p>
</li>
</div>
<% end %>

此外,当我在 posts_controller 中输入 @post.user = @user 时,错误变为“nil:NilClass 的未定义方法 'avatar'”。感谢您的帮助!

您错误地引用了块变量。将 |c| 更改为 |comment| 或将 comment 引用更改为 c.

像这样:

<%= image_tag(c.user.avatar.small.url, class: "media-object") if c.user.avatar? %>

undefined method 'user' for nil:NilClass

错误是因为这一行

<%= render partial: 'comments/comment', locals: { comment: @comment } %>

您没有在 posts_controllershow 方法中初始化 @comment,并且您将它作为 locals 传递给 comment,所以 comment.user returns 错误。

而且我还注意到 _comment.html.erb 中有这一行 <% @post.comments.each do |c| %>,因此您可以使用 c 而不是 comment

<%= image_tag(c.user.avatar.small.url, class: "media-object") if c.user.avatar? %>