2012-02-16 91 views
0

我是Rails的新手,我有一個新手問題。如何通過另一個模型在模型中創建記錄?

我有三個型號:

用戶 - <客戶 - <項目

要創建一個新的項目我想這樣做,在我的項目控制器:

def create 
    @project = current_user.projects.build(params[:project]) 
end 

然而,我總是得到一個錯誤,說client_id缺失,即不能在Projects表中設置我想。

有人可以告訴我我在這裏失蹤了嗎?

在我的用戶模型我有...

has_many :projects, :through => :clients

...我認爲應該讓

@user.projects.build()

工作。但事實並非如此。

+1

確實將此添加到您的遷移文件,並且您運行db:migrate? – wintersolutions 2012-02-16 21:18:21

+0

是的,我做到了 – Tintin81 2012-02-17 12:09:50

回答

1

我覺得你的項目表/模型需要的client_id您正在使用指定當您使用

current_user.projects.build(params[:project]) 

我想你應該使用類似

active_project = current_user.active_project 
active_project.clients.build(params[:project]) 

這僅僅是一個例子來使用。

1

從您的聯繫中,Project屬於Client,屬於User。你可能想要考慮重新設計。

但是,如果你想保持目前的設計,可以在一對夫婦的方式解決這個錯誤

@client = Client.find params[:client] 
@project = @user.project.build params[:project], :client_id => @client.id 

OR

@project = @user.clients.find(params[:client]).projects.build(params[:project]) 

無論哪種方式,用戶沒有項目。他們有客戶,反過來有項目。您可能想要考慮將Project模型作爲連接模型。在這種情況下...

# user.rb 
    has_many :clients, :through => :projects 

# client.rb 
    has_many :users, :through => :projects 

# project.rb 
    belongs_to :clients 
    belongs_to :users 
+0

你好,感謝您的幫助。你爲什麼認爲我的社團看起來不正確?在我的應用程序中,用戶應該管理他們的客戶端,而客戶端又可以分配項目。這不可行嗎? – Tintin81 2012-02-17 12:10:18

+0

你的第二個例子就像一個魅力,即使我不知道如何從窗體(最好是選擇框)獲取client_id。當我手動提供client_id時,它工作得很好:'@project = current_user.clients.find(1).projects.build(params [:project])' – Tintin81 2012-02-17 12:13:36

+0

您給出的第一個例子在這裏導致錯誤:**錯誤參數數量(1表示2)**。我認爲它只適用於@ user.projects而不是'@ user.project' – Tintin81 2012-02-17 12:16:01

1

的問題,當你打這通電話,是,客戶但這建立在?只是建立在current_user.projects不提供此信息。爲了解決這個問題,我們必須查看你的表單和/或路由,以提供要使用哪個客戶端的信息。

例如,您可以讓表單實際上從客戶端開始,然後在您的表單中使用嵌套資源,然後提供新項目。

+0

是的,我想通過下拉選擇框提供'client_id',但我不知道該怎麼做。如何才能做到這一點? – Tintin81 2012-02-17 13:49:48

+0

看看這些railscasts:http://railscasts.com/episodes?utf8=%E2%9C%93&search=nested – DGM 2012-02-17 18:03:01

+0

感謝您的提示,發現它非常有用! – Tintin81 2012-02-19 16:47:42

相關問題