如何针对未经许可的参数提出错误,但允许特定参数?

时间:2015-10-08 16:08:11

标签: ruby-on-rails strong-parameters

我已将以下内容添加到application.rb,因为我希望控制所有已发送的参数:

config.action_controller.action_on_unpermitted_parameters = :raise

这种方式,如果我忘记允许参数,或类似的东西,我会在开发过程中看到相当快。

但是 - 现在尝试通过表单更新用户时出现以下错误:

found unpermitted parameters: utf8, _method, authenticity_token, commit, locale, id

我对如何继续有点不确定:确实这些是我之前并不关心的参数,它们是由Rails自动发送的。 form_for,据我所见。

我只想关心我资源的参数,例如user[name]user[email]

有没有办法一般允许上面那些不允许的参数?或者我是否错过了一个重点?

更新

由于问题似乎不可复制,所以这里是具有特定提交的存储库:

https://github.com/jmuheim/base/commit/dbb62dd68a8a243d056457c9093a6cd8ea3e3836

只需启动服务器,加载页面,以用户身份注册(或使用来自种子的pw josh joshjosh),然后转到用户>列出用户,并编辑您的用户。然后你会得到错误。

您也可以$ rake查看失败的规格。

有趣的是,注册时错误,所以我猜这与UsersController有关。可能是inherited resources的问题?

2 个答案:

答案 0 :(得分:1)

我刚刚使用您的应用程序,并设法重现您的问题。如果我理解你的问题,这就是我想说的话:

  1. Sign upDevise::RegistrationsController#create处理。这就是为什么它不会失败。
    1. 在仪表板中单击Users -> Create user时,它也会失败。来自日志:

      Processing by UsersController#new as HTML
      ...
      [1] base(#<UsersController>) »  params
      => {
        "controller" => "users",
        "action" => "new",
        "locale" => "en"
      }
      

      虽然它只是一个#new动作,所以不需要检查允许的参数。 我认为您应该在inherited resources文档中对此进行调查。

      1. 以下是来自rails docsedit问题的解决方案:

        params.require(:user).permit(
                         :name,
                         :email,
                         :avatar,
                         :avatar_cache,
                         :remove_avatar,
                         :about,
                         :password,
                         :password_confirmation,
                         :lock_version
                       )
        

        3.1

        正如我发现的那样,inheried_resources就像上面一样。尝试搜索&#39;如果您需要params.require&#39;在文档page上。他们的一个建议是:

        def permitted_params
          {
            user: params.require(:user).permit(
              :name,
              :email,
              :avatar,
              :avatar_cache,
              :remove_avatar,
              :about,
              :password,
              :password_confirmation,
              :lock_version
            )
          }
        end
        
      2. 此致

答案 1 :(得分:0)

我终于找到了解决方法。

我发现了这个:https://github.com/rafael/rails/commit/c197a7dc418cd4fe07131a41a44c8ddb66258801

据此,可以如下配置always_permitted_parameters

# application.rb
config.action_controller.always_permitted_parameters = %w( controller action locale utf8 authenticity_token commit )

我不知道为什么我必须手动设置它,而其他人似乎都没有类似的问题。

哦,为了完整起见,这是我通常处理参数的方式:

class UsersController < ApplicationController
  # ...stuff...

  private

  def user_params
    permitted_keys = [:name,
                      :email,
                      :password,
                      :password_confirmation,
                      # etc.
                      :lock_version]

    params.require(:user).permit permitted_keys
  end
end