如何使两个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))

有人知道怎么做这样的事吗?

如果你只有两个,那么只需重复它们,也许可以格式化你的代码,使重复变得明显:

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

其他任何东西都只是一堆额外的噪音,没有任何用处。任何看过上面内容的人都会立刻知道发生了什么,这是一个良好的干净代码的指标。

使用Hash[]构造函数或具有默认值的Hash,您可能会想出一些聪明的方法,但这将是浪费聪明。聪明的供应有限,所以你应该把它留到真正需要的特殊场合。

否。

首先,params[:user]是一个ruby散列。散列将对象与其他对象相关联。常见的是,它将符号作为关键字,将其他对象作为值。所以你不会让一个符号指向任何东西。

其次,调用这个调用的Hash#merge,它需要另一个Hash。传递给合并的上的所有键和值都将与接收器合并。所以你必须向它传递一个真实有效的散列。

第三,要求您在rails中执行此操作的validates_confirmation_of调用旨在防止这种使用。通过强制用户设置两次密码,很难将其设置为不正确的密码。将其强制分配到一个单独的键中违背了该功能的精神,应该明确分配给这两个键。

因此,您的第一个代码片段是正确的,也是本例中应该使用的代码片段。

相关内容

最新更新