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

时间:2016-09-07 23:21:02

标签: ruby-on-rails strong-parameters rails-console pry

在我的rails控制器中,在pry会话中,我的params哈希是nilrequest.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

导致这种情况的原因是什么?

2 个答案:

答案 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