2013-04-08 37 views
0

我有一個質量分配錯誤,我只能用UGLY代碼修復。我一定做錯了什麼。 讓我解釋一下:使用內建has_many關係創建操作導致質量分配錯誤

我的rails應用程序客戶端有很多聯繫人。客戶端頁面顯示屬於該客戶端的聯繫人列表。 我希望能夠將新聯繫人添加到列表中。所以我通過客戶端使用接觸器...

<%= link_to('new contact', new_contact_path(client_id: @client)) %> 

在ContactsController ....

def new 
client=Client.find(params[:client_id]) 
@contact=client.contacts.new 
end 


def create 
    @client = Client.find(params[:contact][:client_id]) 
    @contact= @client.contacts.build(params[:contact]) 
     if @contact.save 
... 

'保存' 結果在意料之中錯誤:

Can't mass-assign protected attributes: client_id

,因爲接觸參數包括在聯繫人模型中不是(也不應該)attr_accessible的client_id

我知道如何解決這個問題的唯一方法是分別設定各項參數(不包括CLIENT_ID)如下:

@contact= @client.contacts.build(first_name: params[:contact][:first_name], last_name:  params[:contact][:first_name], email: params[:contact][:email]) 

這種方法的作品,但它只是一切似乎錯了。當然是一些更優雅的選擇。 任何幫助表示讚賞。 (是的,我是新來的導軌)

回答

1

要跳過部分告訴你如何解決你的錯誤,我想告訴你如何在第一個地方編碼:)如果我錯了。

Routes.rb你就應該把(如果沒有的話):

resources :client do 
    resources : contacts 
end 

之後,第二次在你view文件,你應該把這樣的事情:

<%= link_to('new contact', new_client_contact_path(@client)) %> 

這樣一來,你在創建動作中不需要做任何事情,Rails將管理所有其他事情。 這是它應該做

編輯方式:

只是爲了更清楚。 在您contacts控制器new動作,你應該把:

user= user.find(params[:user_id]) 
#2nd you build a new one 
@contact= user.contacts.build 

而在你create行動contacts控制器,你應該把:

user = User.find(params[:user_id]) 
#2nd you create the contact with arguments in params[:contact ] 
@contact = user.contact.create(params[:contact ]) 
response ..... 
+0

感謝...我非常確信我是想以錯誤的方式解決問題。這似乎是一個很常見的場景 – zambacan 2013-04-08 11:54:33

+0

是的。我添加了新的和創建操作的代碼(我沒做過測試,所以如果只是複製粘貼,可能會出錯)。但是,這很常見。如果您想更多地瞭解,請查找「嵌套資源」以及如何使用它們。很高興幫助。謝謝 – Aleks 2013-04-08 11:57:01

+0

謝謝你Aleks。非常感激。 – zambacan 2013-04-08 23:08:01

相關問題