我怎样才能对不允许的参数提出错误,但允许特定的参数?
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 有问题?
我刚刚使用了您的应用程序并成功地重现了您的问题。如果我理解你的问题是正确的,这就是我想说的:
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
文档中对此进行调查。
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
我已将以下内容添加到我的 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 有问题?
我刚刚使用了您的应用程序并成功地重现了您的问题。如果我理解你的问题是正确的,这就是我想说的:
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
文档中对此进行调查。
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