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 就地执行它。