在我的rails控制器中,在pry会话中,我的params
哈希是nil
。 request.params
具有预期的哈希值。
如果我注释掉params = …
行,params
会恢复正常。
class UsersController < Clearance::UsersController
skip_before_filter :verify_authenticity_token
def update
binding.pry
params = params.require(:user).allow(:foo)
end
end
导致这种情况的原因是什么?
答案 0 :(得分:3)
首先,params
是一种方法。 http://api.rubyonrails.org/classes/ActionController/StrongParameters.html#method-i-params
在您的代码中,当您编写
时params = params.require(:user).allow(:foo)
初始化一个名为params的变量。
当你点击撬时,你已经初始化(在加载代码时初始化)但尚未设置变量的值params
。因此,当您在撬内调用它时,它将设置为nil
。方法params
会被update
方法范围内的变量覆盖。
答案 1 :(得分:0)
params
哈希是用户请求页面时获得的哈希值。例如:
https://www.example.com/index.html?username=john&email=john@example.com
params
哈希将是
{username: 'john', email: 'john@example.com'}
然后您可以评估params[:username]
。
看起来您正在尝试使用强参数来设置用户可以或不可以更新的内容。在这种情况下,你应该做的是
def update
user = User.find(params[:id])
user.update_attributes(params.require(:user).permit(:foo))
end
这只允许用户更新foo
属性,而不允许其他任何内容。
因为这很常见,所以编写一个名为user_params
的私有方法并在调用save
时调用该方法是标准的。
def update
user = User.find(params[:id])
user.update_attributes(user_params)
end
private
def user_params
params.require(:user).permit(:foo)
end