对Post模型的评论不会呈现,也不会显示错误消息

时间:2015-08-24 05:46:26

标签: ruby-on-rails ruby

我正在学习并尝试为简单的应用添加功能。我正在为每个微博添加注释功能,并且创建注释工作正常,但注释不会呈现。没有错误消息,应用程序运行完全正常,除了评论部分只是不包括在最终视图中。

我在这里看过类似的问题并尝试了很多解决方案,我甚至不确定问题出在哪里,任何帮助都会非常感激。

我有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而且我总是避免在网上提出愚蠢的问题,但这次经历向我展示了一些人有多棒!我需要学习很多东西,通过实用的程序员系列阅读,我会尽力回馈社区!

3 个答案:

答案 0 :(得分:0)

这无法正常工作

ImageButton

你的微博模型中有<%= micropost.comment.comment_content %> 关系。 你可以解决这个问题,通过has_many

的顺序为你的微博模型添加一个has_one关系

或临时(非常临时)

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_manybelongs_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中加载MicropostUsersController#show。除非您的UserMicropost数据库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>