为什么我的参数哈希为零?

Joh*_*hir 6 ruby-on-rails rails-console pry strong-parameters

在我的 Rails 控制器中,在窥探会话中,我的params哈希值是nil. request.params具有预期的哈希值。

\n\n

如果我注释掉该params = \xe2\x80\xa6行,params则恢复正常。

\n\n
class UsersController < Clearance::UsersController\n  skip_before_filter :verify_authenticity_token\n\n  def update\n    binding.pry\n    params = params.require(:user).allow(:foo)\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能是什么原因造成的?

\n

Gab*_*iel 8

首先params是方法。 http://api.rubyonrails.org/classes/ActionController/StrongParameters.html#method-i-params

在你的代码中,当你写

params = params.require(:user).allow(:foo)
Run Code Online (Sandbox Code Playgroud)

您初始化一个名为 params 的变量。

当您敲击撬棒时,您已经初始化(在加载代码时初始化),但尚未设置变量 的值params。因此,当您在 pry 中调用它时,它被设置为nil。该方法params将被方法范围内的变量覆盖update


dav*_*000 0

哈希params值是用户请求页面时获得的内容。例如:

https://www.example.com/index.html?username=john&email=john@example.com
Run Code Online (Sandbox Code Playgroud)

哈希params值将是

{username: 'john', email: 'john@example.com'}
Run Code Online (Sandbox Code Playgroud)

然后你就可以评估了params[:username]

看起来您正在尝试使用强参数来设置用户可以或不能更新的内容。在这种情况下,你应该做的是

def update
  user = User.find(params[:id])
  user.update_attributes(params.require(:user).permit(:foo))
end
Run Code Online (Sandbox Code Playgroud)

这将只允许用户更新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
Run Code Online (Sandbox Code Playgroud)