我正在为用户分配一个临时密码。
现在我将其作为代码,它可以工作:
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 :(得分: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
调用旨在防止此用途。通过强制您将其设置两次,很难将用户设置为错误的密码。将此强制转换为单个赋值违背了该功能的精神,并且应该明确地分配给两个键。
所以你的第一个片段是正确的,在这种情况下应该使用它。