我正在学习并尝试为简单的应用添加功能。我正在为每个微博添加注释功能,并且创建注释工作正常,但注释不会呈现。没有错误消息,应用程序运行完全正常,除了评论部分只是不包括在最终视图中。
我在这里看过类似的问题并尝试了很多解决方案,我甚至不确定问题出在哪里,任何帮助都会非常感激。
我有3个相关模型:用户,Microposts,评论。 Microposts属于Users,has_many评论。 评论属于Microposts和用户 注释模型包括“comment_content”,“micropost_id”,“user_id”和“created_at”的列。
Micropost.rb
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :comments, dependent: :destroy
default_scope -> { order(created_at: :desc) }
validates :user_id, presence: true
validates :content, presence: true, length: { maximum: 1000 }
acts_as_votable
Comment.rb
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :micropost
validates :comment_content, presence: true
validates :user_id, presence: true
validates :micropost_id, presence: true
User.rb
class User < ActiveRecord::Base
has_many :microposts, dependent: :destroy
has_many :comments
用户控制器#show
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
@micropost = Micropost.find(params[:id])
@comment = Comment.new
@comments = Micropost.find(params[:id]).comments.paginate(page: params[:page])
end
评论控制器#create
def create
@micropost = Micropost.find(params[:micropost_id])
@comment = Comment.new(comment_params)
@comment.micropost = @micropost
@comment.user = current_user
if @comment.save
flash[:success] = "Comment created!"
redirect_to current_user
else
render 'shared/_comment_form'
end
end
从_micropost partial
进行视图渲染<ul>
<%= render @comment %>
</ul>
评论部分_comments
<%= link_to gravatar_for(@micropost.user, size: 15), @micropost.user %>
<%= link_to @micropost.user.name, @micropost.user %>
<% @micropost.comments.each do |comment| %>
<%= comment.comment_content %>
<% end %>
评论表格显示得很好。登录并创建注释后,我检查控制台并确认已创建注释,具有正确的内容,与发布帖子的用户以及评论的微博相关联。 所以评论就坐在DB中,它就不会出来了!
解决方案
UsersController:
def show
@user = User.find(params[:id])
end
视图
<% @user.microposts.each do |micropost| %>
<%= link_to gravatar_for(@user, size: 15), @user %>
<%= link_to @user.name, @user %>
<% micropost.comments.each do |comment| %>
<%= comment.comment_content %>
<% end %>
<% end %>
基本上就是这样,我正在重载我的UsersController#show,这让整个事情失去了意义。正如下面的建议所述,用户控制器正在进行繁重的工作,我不应该在那里定义那么多变量。
无法表达对@thedanotto和@fylooi的感谢。他们都是正确的。他们带我走过的所有故障排除都教会了我很多。这是令人生畏的学习Rails而且我总是避免在网上提出愚蠢的问题,但这次经历向我展示了一些人有多棒!我需要学习很多东西,通过实用的程序员系列阅读,我会尽力回馈社区!
答案 0 :(得分:0)
这无法正常工作
ImageButton
你的微博模型中有<%= micropost.comment.comment_content %>
关系。
你可以解决这个问题,通过has_many
或临时(非常临时)
created_at
<强>更新强>
您的部分<%= micropost.comments.last.comment_content %>
只需与_comments
变量对话即可。
所以将您的comment
更改为micropost.comment.comment_content
用户名应通过
{user}到用户模型comment.comment_content
delegate
在评论模型中。现在您可以使用delegate :name, to: :user, prefix: true, allow_nil: true
来显示用户名
最好的
答案 1 :(得分:0)
您的has_many
和belongs_to
关系似乎已正确设置。这意味着您可以依靠导轨来完成控制器和视图中的大部分繁重工作。
用户控制器#show 变为......
def show
@user = User.find(params[:id])
end
views / users / show.html.erb 变为......
<% @user.microposts.each do |micropost| %>
<%= link_to gravatar_for(@user, size: 15), @user %>
<%= link_to @user.name, @user %>
<!-- You have access to micropost here as well, you could still do micropost.user, micropost.user.name instead of @user -->
<% micropost.comments.each do |comment| %>
<%= comment.comment_content %>
<% end %>
<% end %>
答案 2 :(得分:0)
一些事情:
您已根据ID在User
中加载Micropost
和UsersController#show
。除非您的User
和Micropost
数据库ID同步移动,否则我看起来并不合适。
@user = User.find(params[:id])
@micropost = Micropost.find(params[:id])
Micropost
应该显示在MicropostsController
中,而不是UsersController
。例如。 /microposts/1
应返回第一个Micropost
资源,而/users/1
返回第一个User
资源。
我将假设您尝试从microposts
comments
及其相关UsersController#show
基于此,您的变量结构可按以下方式排列:
# users_controller.rb
class UsersController
def show
@user = User.find(params[:id])
@microposts = @user.microposts
# better practice is to have only one @ instance variable in the
# controller, but let's go with this for academic purposes
end
end
# views/users/show.html.erb
<%= render @microposts %>
# this can also be written as
# <% @microposts.each do |micropost|
# <%= render partial: 'micropost', locals: { micropost: micropost }
# <% end %>
# views/users/_micropost.html.erb
<%= link_to gravatar_for(micropost.user, size: 15), micropost.user %>
<%= link_to micropost.user.name, micropost.user %>
<ul>
<%= render micropost.comments %>
</ul>
# views/users/_comment.html.erb
<li>
<%= comment.content
</li>