在 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_controller
的 show
方法中初始化 @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? %>
我是 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_controller
的 show
方法中初始化 @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? %>