这是我的用户模型:
class User < ActiveRecord::Base
has_many :posts
end
这是我的帖子模型:
class Post < ActiveRecord::Base
before_create :ejer
belongs_to :user
def ejer
self.user.build
end
end
我正在使用 devise,当我登录并尝试创建帖子时,出现此错误:
NoMethodError in PostsController#create
undefined method `build' for nil:NilClass
我在帖子表中创建了一个列user_id。
为什么我会收到错误,如何帮助使用帖子登录的当前用户?
self.user
将被nil
,因此您正在尝试在 nil 上运行方法构建,这将引发一个异常,就像您得到的那样。
要将用户添加到帖子中,您可以通过设置属性来分配它:
def ejer
self.user = User.new
end
您也可以使用 build_user 方法
def ejer
build_user
end
或者将用户设置为现有用户:
def ejer
self.user = User.first
end
从你对马里奥的评论来看,你实际上并不想建立一个新用户——这将创建一个新记录。
我建议看看sentient_user宝石。一旦你在模型和控制器中正确连接了它,你的帖子模型就可以变成:
class Post < ActiveRecord::Base
belongs_to :user
validates :user, :presence => true
before_validate do
self.user ||= User.current_user
end
end
我将钩子更改为before_validate
并添加验证以确保有一个关联的用户,因为在大多数情况下,允许在没有用户 ID 的情况下创建帖子是没有意义的。
(哦,我相信还有其他解决方案可以获得User.current_user或等效物,sentient_user只是我个人使用的解决方案。