2011-05-15 44 views
1

这里是我的用户模型:Rails的帮助创造有许多属于assoction

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列。

为什么我会遇到错误,以及如何与当前登录该帖子的用户相关联?

+0

你迁移你的数据库? – Gazler 2011-05-15 11:44:31

+0

是的,我已经迁移了我的数据库 – Math 2011-05-15 11:45:19

+0

你能显示控制器的代码吗? – tokland 2011-05-15 12:26:46

回答

0

self.usernil所以你试图运行的方法建立在零这将引发异常,如你正在。

def ejer 
    self.user = User.new 
end 

您也可以使用build_user方法

def ejer 
    build_user 
end 

或者用户设置为现有用户:

要通过设置属性将用户添加到后期你可以为它分配:

def ejer 
    self.user = User.first 
end 
+0

我已经使用build_user但没有user_id被提交到数据库中。 user_id应该是current_user.id – Math 2011-05-15 11:54:00

+0

哦对,那么你需要将用户分配给当前用户。 'self.user = current_user' – 2011-05-15 14:51:25

+0

然后我得到一个nameerror:未定义的局部变量或方法'current_user' – 2011-05-15 14:56:31

0

根据您对Mario的回应判断,您实际上并不想构建一个新用户 - 这将创建一个新的记录。

我推荐看看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并增加了验证,以确保有,因为在大多数情况下,相关的用户它在没有用户标识的情况下创建帖子是没有意义的。

(哦,我敢肯定,有得到一个User.current_user或等效的其他解决方案,sentient_user只是一个我个人使用。)