我怎样才能对不允许的参数提出错误,但允许特定的参数?

How can I raise an error for unpermitted params, but allow specific ones?

我已将以下内容添加到我的 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

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

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

有意思的是注册时报的错误是而不是,估计跟UsersController有关。也许 inherited resources 有问题?

我刚刚使用了您的应用程序并成功地重现了您的问题。如果我理解你的问题是正确的,这就是我想说的:

  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. edit 问题的解决方案来自 rails docs:

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

    3.1 但是

    我发现这不适用于 inheried_resources 就像上面一样。尝试在文档 page 上搜索 'If you need params.require'。他们的建议之一是:

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

此致

我终于找到了解决办法。

我找到了这个: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