ruby-on-rails - Rails - 未定义方法 `username' for nil :NilClass

标签 ruby-on-rails activerecord

我正在制作一个网站,它也有文章和评论,文章与用户无关,因为只有我作为管理员才能创建文章...但是也有与用户和文章相关联的评论,但是当我尝试显示创建评论的用户的用户名,在文章的评论部分,它给了我这个错误“undefined method `username' for nil:NilClass”

型号

用户模型

has_many :comments

文章模型

has_many :comments

评论模型

  belongs_to :article
  belongs_to :user

显示评论的文章 Controller

def show
    @article = Article.find(params[:id])
    @comments = @article.comments
end

和 View

<h2>Comments <%= @comments.count %></h2>
    <% @comments.each do |comment| %>
        <%= comment.content %>
        <%= comment.user.username %>
    <% end %>

创建评论的评论 Controller

def create
    @article = Article.find(params[:article_id])
    @comment = Comment.new(comment_params)
    @comment.article = @article
    @comment.user = current_user
    @comment.save

    redirect_to article_path(@article)
end

最佳答案

您需要进行如下设置:

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

# app/models/article.rb
class Article < ActiveRecord::Base
  belongs_to :user
  has_many :comments, dependent: :destroy
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :article
  belongs_to :user
end

rails g migration AddUsernameToUsers username:string:uniq
rails g migration AddUserIdToArticles user_id:integer
rails g migration AddArticleIdToComments article_id:integer
rails g migration AddUserIdToComments user_id:integer
rake db:migrate

这允许您拥有可以在 User 模型上调用的 .username 方法,并允许以下关系返回正确的用户名:

u = User.new(:username => "Foo")
u.save
a = Article.new(:user_id => 1)
a.save
comment = Comment.new(:article_id => 1, :user_id => 1)
comment.save

comment.user.username
# => "Foo"

请注意,如果您使用 Devise,则需要执行以下操作:

rails g migration AddUsernameToUsers username:string:uniq
rake db:migrate

关于ruby-on-rails - Rails - 未定义方法 `username' for nil :NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301190/

相关文章:

ruby-on-rails - 如何在 activerecord 之外创建 activerecord 样式验证?

ruby-on-rails - Rails 事件记录查找 nil 的位置

ruby-on-rails - 无法在任何来源中找到 activemodel-3.2.0(Heroku 上的 Rails 3.2)

ios - Rails API - 并行处理多个交易 - 平衡支付

ruby-on-rails - rails : validates_uniqueness_of with conditions not working as expected

ruby-on-rails - ActiveRecord 上的作用域关系

ruby-on-rails - Rails 3.0 中的 Arel 究竟是什么?

'script' 标签内的 JavaScript 与 'application.js' 之间的 JavaScript

ruby-on-rails - Rails : import timestamps, 不同时区和夏令时

ruby-on-rails - 使用 Redis 进行 Rails 验证