2011-07-01 30 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通话,要求你这样做在轨设计,以防止这种情况的使用。通过强制您将其设置两次,使用户很难设置错误的密码。将其强制分配到一个单独的任务中违背了该特性的精神,并且应该明确地分配给两个密钥。

所以,你的第一个片段是正确的,什么是应该在这种情况下使用。

相关问题