2011-05-15 54 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只是一個我個人使用。)