注释与用户

时间:2016-02-04 00:56:45

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord actioncontroller

我有三个模型:用户模型,帖子模型和评论模型。用户可以创建帖子,然后在帖子的显示页面内,有一个评论列表,其中包含发表评论的表单。评论会发布并显示在帖子的显示页面上。我选择在帖子中嵌入评论,并让用户独自一人。这是我的routes.rb和我的每个模型

resources :users, except: [:index]

资源:帖子,除了:[:index,:edit,:update] do     资源:评论,仅限:[:create,:destroy]   端

class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
has_many :comments, foreign_key: "author_id"

class Post < ActiveRecord::Base
belongs_to :user
has_many :comments, dependent: :destroy

class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :author, class_name: "User"

我的问题在于用户和评论之间的关联(我相信)。在我的帖子/节目视图中,我有以下代码:

<% if @comments.any? %>
                <% @comments.each do |comment| %>
                    <p><%= comment.author_id %>: <%= comment.content %></p>
                <% end %>
            <% end %>

此代码有效,例如它为注释打印以下内容(假设创建它的用户的id为15)

15:这是评论

通过这种方式,我很清楚它的作者是谁。但这是问题:当我尝试打印出以下内容时:

<p><%= comment.author.full_name %>: <%= comment.content %></p>

它给了我这个&#34;动作控制器:异常抓住&#34;错误:

&#34;未定义的方法`用户名&#39;为零:NilClass&#34;

联盟是否应该能够为我提取作者的(用户)full_name属性?我知道我在这里遗失了一些东西,非常感谢任何帮助。我将在下面包括我的帖子控制器和评论控制器。 我的帖子控制器显示了操作:

def show
    @post = Post.find(params[:id])
    @comment = @post.comments.build
    @comments = @post.comments
end

这是我的评论控制器创建动作,然后是我强大的参数:

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.build(comments_params)
    if @comment.save
        flash[:good] = "Your comment has been posted!"
        redirect_to @post
    else
        flash[:bad] = "Sorry, your comment failed to post."
        redirect_to @post
    end
end

def comments_params
        params.require(:comment).permit(:content, :author_id)
    end

2 个答案:

答案 0 :(得分:1)

错误表明您的关联存在问题。

快速解决方法是使用try

<%= comment.author.try(:full_name) %>

这相当于...... <%= comment.author.full_name if comment.author %>

-

我个人使用以下内容:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :comments, foreign_key: :author_id
end

#app/models/comment.rb
class Comment < ActiveRecord::Base
   belongs_to :author, class_name: "User"
end

答案 1 :(得分:0)

确保您的评论已使用用户和帖子编入索引。

用户模型:

User model: class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
end

发布模型

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments, dependent: :destroy
end

评论模型

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :author, class_name: "User",  foreign_key: "user_id"
end

在您的观看中:

<% if @comments.any? %>
         <% @comments.each do |comment| %>
              <p><%= comment.author.full_name %>: <%= comment.content %></p>
         <% end %>
 <% end %>