【问题标题】:Why is my params hash nil?为什么我的参数哈希为零?
【发布时间】:2017-01-15 18:19:21
【问题描述】:

在我的 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

这可能是什么原因造成的?

【问题讨论】:

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


    【解决方案1】:

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

    在您的代码中,当您编写时

    params = params.require(:user).allow(:foo)
    

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多