Rails helper创建has_many并属于关联

时间:2011-05-15 11:41:31

标签: ruby-on-rails ruby ruby-on-rails-3

这是我的用户模型:

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

我正在使用设计,当我登录并尝试创建帖子时,我收到此错误:

NoMethodError in PostsController#create

undefined method `build' for nil:NilClass

我在posts表中创建了一个user_id列。

为什么我会收到错误,如何将当前用户与帖子关联?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

根据您对马里奥的回应判断,您实际上并不想建立新用户 - 这会创建新记录。

我建议您查看sentient_user gem。一旦你在模型和控制器中正确地连接它,你的帖子模型就可以变成:

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只是我个人使用的。)