2012-07-23 43 views
0

我有一個用戶填寫表單,其中包含標題和正文。我還想傳遞存儲在Cookie中的用戶ID以及其他一些計算值。將散列傳遞給具有額外參數的控制器

在我創造我的控制器的部分我有以下代碼:

@ticket = Ticket.new(params[:ticket]) 
@ticket.save 
redirect_to ticket_path(@ticket) 

我需要的Ticket.new調用後分配這些計算值或我可以通過這些與params哈希表莫名其妙一起?

+0

我試着在調用Ticket.new後分配這些值,它工作。有沒有一種方法可以將它們包含在該調用中,以便稍微縮短代碼? – Brian 2012-07-23 20:01:44

回答

3

既然則params的標籤密鑰只是一個哈希,你可以用合併來增加額外的鍵/值對

@ticket = Ticket.new(params[:ticket].merge({user_id: cookies[:user_id]})) 
@ticket.save 
redirect_to ticket_path(@ticket) 

假設你使用的是Active關係和Userhas_many :tickets你也可以做這樣的事情(本例假設current_user由類似設計的東西定義)

@ticket = current_user.tickets.build(params[:ticket]) 
@ticket.save 
redirect_to ticket_path(@ticket) 

第二種方式使得它更清晰一點你正在嘗試做的。

+0

謝謝埃文。我是新來的鐵軌,並沒有運行構建方法。看起來它與'new'類似,但是通過使用外鍵的現有對象進行調用。那是對的嗎? – Brian 2012-07-23 20:30:48

+0

沒問題。你是對的。 'build'是一個ActiveRecord :: Relation方法,而'new'(在你使用它的上下文中)是一個用於創建一個Class的新實例的Ruby方法。在Rails的最新版本中,'new'是ActiveRecord :: Relation中'build'的別名,所以你可以在'current_user.tickets'上下文中使用兩個可互換的,但我更喜歡'build'。有幾個很好的解釋與新的構建。 – 2012-07-23 20:49:15

0

您可以在表單中使用f.hidden_field來傳遞一些額外的計算值。

如果你想分配current_user門票,最好是在單獨的任務中,並保持它的保護。

+0

除了能夠將它包含在散列中之外,將它作爲隱藏字段包含在表單中是否會有優勢?我唯一擔心的是查看源代碼的人可能會看到user_id。 – Brian 2012-07-23 20:32:37

相關問題