我已将以下内容添加到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的问题?
答案 0 :(得分:1)
我刚刚使用您的应用程序,并设法重现您的问题。如果我理解你的问题,这就是我想说的话:
Sign up
由Devise::RegistrationsController#create
处理。这就是为什么它不会失败。在仪表板中单击Users -> Create user
时,它也会失败。来自日志:
Processing by UsersController#new as HTML
...
[1] base(#<UsersController>) » params
=> {
"controller" => "users",
"action" => "new",
"locale" => "en"
}
虽然它只是一个#new
动作,所以不需要检查允许的参数。
我认为您应该在inherited resources
文档中对此进行调查。
以下是来自rails docs的edit
问题的解决方案:
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
此致
答案 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