【问题标题】:How can I raise an error for unpermitted params, but allow specific ones?如何为未经许可的参数引发错误,但允许特定参数?
【发布时间】:2015-10-08 16:08:10
【问题描述】:

我在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 和来自种子的密码 joshjosh),然后转到用户 > 列出用户,然后编辑您的用户。然后你会得到错误。

您也可以直接执行 $ rake 并查看失败的规范。

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

【问题讨论】:

  • 可能只有我一个人,但是当我打开该选项时,rails 会忽略那些默认参数。我无法重现您的问题。
  • 我更新了问题。
  • @JoshuaMuheim 我认为您的问题在于您的特定应用程序。我知道这听起来很明显,但正如其他人所说,它应该在任何情况下都可以重现。我建议不要要求社区在本地启动您的应用程序,因为这违反了“我做错了什么?”的标志。并将调试的负担交给我们社区。​​span>

标签: ruby-on-rails strong-parameters


【解决方案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 docs 中对此进行调查。


  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 上搜索“如果您需要 params.require”。他们的建议之一是:

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

问候

【讨论】:

  • 非常感谢,我会尽快看看。我将您标记为正确答案,以便您获得赏金。
【解决方案2】:

我终于找到了解决办法。

我发现了这个: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多