如何让两个Ruby符号指向同一个对象?

时间:2011-07-01 08:13:10

标签: ruby ruby-on-rails-3

我正在为用户分配一个临时密码。

现在我将其作为代码,它可以工作:

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))

任何人都知道如何做这样的事情?

2 个答案:

答案 0 :(得分:3)

如果您只有两个,那么只需重复它们,然后格式化您的代码以使重复变得明显:

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

任何其他东西都只是一堆额外的噪音,没有任何用处。任何看过上述内容的人都会立即知道发生了什么事,并且这是一个很好的清洁代码的指标。

你可能会使用Hash[]构造函数或可能Hash with a default value来提出一些聪明的东西,但这会浪费聪明。聪明才有限,所以你应该在真正需要的时候保存它。

答案 1 :(得分:1)

没有

首先,params[:user]是一个红宝石哈希。哈希将对象与其他对象相关联。通常它将一个符号作为键,将一些其他对象作为值。所以你不要让符号指向任何东西。

其次,调用此调用Hash#merge,它需要另一个Hash。您传递给合并的所有键和值都与接收器合并。所以你必须传递一个真实有效的哈希值。

第三,要求您在rails中执行此操作的validates_confirmation_of调用旨在防止此用途。通过强制您将其设置两次,很难将用户设置为错误的密码。将此强制转换为单个赋值违背了该功能的精神,并且应该明确地分配给两个键。

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