2013-01-23 34 views
1

我收到了「ProjectsController#創建NoMethodError」使用下面的代碼:未定義的方法在軌「建設」 3

def create 
    @project = current_user.project.build(params[:project]) 
    if @project.save 
    flash[:success] = "Project created!" 
    redirect_to root_url 
    end 
end 

我一直在使用@project = current_user.project.create(params[:project])也試過,但我得到了同樣的錯誤,儘管爲.create

我的項目模式是這樣的:

class Project < ActiveRecord::Base 
    attr_accessible :title, 
        :sub_title, 
        :desc, 
        :category 

    validates :user_id, presence: true 
    validates :title, presence: true, length: { maximum: 35 } 
    validates :category, presence: true 

    belongs_to :user 
    ... 
end 

和我的用戶模型是這樣的:

class User < ActiveRecord::Base 
    attr_accessible :name, 
        :surname, 
        :email, 
        :email_confirmation, 
        :password, 
        :password_confirmation 

    has_secure_password 

    has_one :project 
    ... 
end 

從我所知,這應該創建一個新的項目,把一個關聯到user.idproject.user_id。任何想法爲什麼我得到的錯誤,而不是成功的創造?你想

+0

這是否說未定義的方法構建用戶:類? –

回答

2

對於has_one協會:

@project = current_user.build_project(params[:project]) 

同樣的模式被用於創建:

@project = current_user.create_project(params[:project]) 

如果你看一下has_one documentation他們列出獲得創建方法,當你聲明的關聯。

+0

工作,謝謝!你能解釋一下我們學習Rails的區別嗎?我從[link] railstutorial.org獲得了我的信息,但它沒有提供任何解釋,爲什麼... – Matteo

+0

我認爲主要原因是'has_one'你直接處理一個'ActiveRecord'對象與'has_many'你正在處理一組'ActiveRecord'對象。包含這些'ActiveRecord'對象的額外結構添加了方法,但是它們不能很好地處理由'has_one'產生的單個'ActiveRecord'對象(特別是如果它還不存在!)。不過,它非常令人困惑,它吸引了很多人! –

+0

感謝您的解釋。我希望更多的StackOverflows的答案更多地解釋了答案背後的原因,而不僅僅是給予和回答。 – Matteo