Rails 5 强参数重定向
Rails 5 redirect with strong parameters
控制器:
def foo
redirect_to home_path(params: auth_params)
end
private
def auth_params
params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id)
end
控制器出错的参数如下:
参数:
{"utf8"=>"✓",
"authenticity_token"=>"...",
"auth"=>
{"name"=>"...",
"email"=>"...",
"photo_url"=>"...",
"provider"=>"...",
"provider_id"=>"..."}
}
出现此错误:unable to convert unpermitted parameters to hash
我允许所有参数(rails 默认参数除外(即 utf8,authenticity_token,那么为什么会弹出此错误?
编辑:
以下建议均无效:
redirect_to home_path(auth_params)
redirect_to home_path, params: auth_params
关于我如何进行控制器操作的更多信息可能会有所帮助:
我(在同一个控制器中)有一个操作 bar
,在视图中有一个 form_tag
到 foo_path。我试过通过 jQuery 或提交按钮提交表单,结果没有改变。一旦我点击 auth_params
方法,我就会收到错误消息。
这意味着它在 auth_params
方法上出错,而不是重定向本身
home_path
和其他 url_for
相关方法需要一个 Hash 对象而不是 ActionController::Parameters
对象(这就是控制器 params
中的方法 returns) 所以你需要先把它转换成散列,像这样:
redirect_to home_path(auth_params.to_h)
当我升级到 Rails 5.1.4 时,我也遇到了这个错误。我用这个修复了
redirect_to(home_path, params: params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id))
希望对你有所帮助。
在我重新启动开发服务器并清除了 rails 放置的所有 cookie(最值得注意的是 app-name
会话 cookie)之后,正常的强参数语法(即 params.require() .permit()) 工作正常。
你做错了。如果您正在创建资源,那么您应该通过呈现视图来回复验证错误 - 而不是重定向。
您发送给用户的响应是执行非幂等操作的结果。
这看起来有点挑剔,但在 GET 参数中泄露用户电子邮件和选择的密码是相当鲁莽的。
如果您要在主页中嵌入表单,只需创建一个 auths/new.html.erb
视图即可,该视图仅显示表单并让用户更正错误:
class AuthsController
def create
@auth = Auth.new(auth_params)
if @auth.save
redirect_to some_path, success: "Your account was created"
else
render :new
end
end
private
def auth_params
params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id)
end
end
如果表单必须无缝地包含在主页中,那么您需要呈现该视图或使用 ajax 就地执行它。
控制器:
def foo
redirect_to home_path(params: auth_params)
end
private
def auth_params
params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id)
end
控制器出错的参数如下:
参数:
{"utf8"=>"✓",
"authenticity_token"=>"...",
"auth"=>
{"name"=>"...",
"email"=>"...",
"photo_url"=>"...",
"provider"=>"...",
"provider_id"=>"..."}
}
出现此错误:unable to convert unpermitted parameters to hash
我允许所有参数(rails 默认参数除外(即 utf8,authenticity_token,那么为什么会弹出此错误?
编辑:
以下建议均无效:
redirect_to home_path(auth_params)
redirect_to home_path, params: auth_params
关于我如何进行控制器操作的更多信息可能会有所帮助:
我(在同一个控制器中)有一个操作 bar
,在视图中有一个 form_tag
到 foo_path。我试过通过 jQuery 或提交按钮提交表单,结果没有改变。一旦我点击 auth_params
方法,我就会收到错误消息。
这意味着它在 auth_params
方法上出错,而不是重定向本身
home_path
和其他 url_for
相关方法需要一个 Hash 对象而不是 ActionController::Parameters
对象(这就是控制器 params
中的方法 returns) 所以你需要先把它转换成散列,像这样:
redirect_to home_path(auth_params.to_h)
当我升级到 Rails 5.1.4 时,我也遇到了这个错误。我用这个修复了
redirect_to(home_path, params: params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id))
希望对你有所帮助。
在我重新启动开发服务器并清除了 rails 放置的所有 cookie(最值得注意的是 app-name
会话 cookie)之后,正常的强参数语法(即 params.require() .permit()) 工作正常。
你做错了。如果您正在创建资源,那么您应该通过呈现视图来回复验证错误 - 而不是重定向。
您发送给用户的响应是执行非幂等操作的结果。
这看起来有点挑剔,但在 GET 参数中泄露用户电子邮件和选择的密码是相当鲁莽的。
如果您要在主页中嵌入表单,只需创建一个 auths/new.html.erb
视图即可,该视图仅显示表单并让用户更正错误:
class AuthsController
def create
@auth = Auth.new(auth_params)
if @auth.save
redirect_to some_path, success: "Your account was created"
else
render :new
end
end
private
def auth_params
params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id)
end
end
如果表单必须无缝地包含在主页中,那么您需要呈现该视图或使用 ajax 就地执行它。