2011-07-01 34 views
0

我正在爲我的用戶分配臨時密碼。如何讓兩個Ruby符號指向同一個對象?

現在我有這個代碼和它的工作原理:

temp_password = random_pronouncable_password 
@user = User.create!(params[:user].merge(:password => temp_password, :password_confirmation => temp_password)) 

,但我想一個辦法能做到這一點

@user = User.create!(params[:user].merge(:password, :password_confirmation => temp_password)) 

任何人都知道怎麼做這樣的事情?

+0

你想用這個解決什麼問題? – keymone

回答

3

如果你只有兩個,那麼就不再贅述,也許格式化你的代碼,以使重複顯而易見的:

@user = User.create!(params[:user].merge(
    :password    => temp_password, 
    :password_confirmation => temp_password 
)) 

任何東西都不會只是一堆額外的噪聲是沒有用處。任何看上述內容的人都會立即知道發生了什麼,幾乎沒有任何想法,這是一個很好的乾淨代碼的指標。

你可能會想出一些巧妙的使用Hash[]構造函數或可能Hash with a default value但這會是一個聰明的浪費。聰明是有限的供應,所以你應該保存它的特殊場合,當它真的需要。

+0

+1爲不浪費聰明的筆記。 –

1

首先,params[:user]是紅寶石哈希值。散列將對象與其他對象關聯起來。它通常將一個符號作爲關鍵字,並將一些其他對象作爲值。所以你不要把符號指向任何東西。

其次,調用此調用Hash#merge其期望另一散列。您傳遞給合併的所有鍵和值都將與接收器合併。所以你必須傳遞一個真實有效的散列給它。

第三,validates_confirmation_of通話,要求你這樣做在軌設計,以防止這種情況的使用。通過強制您將其設置兩次,使用戶很難設置錯誤的密碼。將其強制分配到一個單獨的任務中違背了該特性的精神,並且應該明確地分配給兩個密鑰。

所以,你的第一個片段是正確的,什麼是應該在這種情況下使用。

相關問題