【问题标题】:Rails 5 redirect with strong parameters带有强参数的 Rails 5 重定向
【发布时间】:2017-12-28 22:00:02
【问题描述】:

控制器:

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,在转到 foo_path 的视图中有一个 form_tag。我试过通过 jQuery 或提交按钮提交表单,它不会改变结果。当我点击auth_params 方法时,我得到了错误。

这意味着它在 auth_params 方法而不是重定向本身上出错

【问题讨论】:

  • 你试过home_path(params)吗?
  • 通过auth_params 而不是params: auth_params
  • 这些都不能解决问题。见编辑

标签: ruby-on-rails ruby-on-rails-5 strong-parameters


【解决方案1】:

当我升级到 Rails 5.1.4 时,我也遇到了这个错误。我修复了这个

redirect_to(home_path, params: params.require(:auth).permit(:name, :email, :photo_url, :provider, :provider_id))

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    在我重新启动开发服务器并清除所有由 rails 放置的 cookie(最值得注意的是 app-name 会话 cookie)后,正常的强参数语法(即 params.require().permit())工作正常。

    【讨论】:

      【解决方案3】:

      home_path 和其他 url_for 相关方法需要一个 Hash 对象而不是 ActionController::Parameters 对象(这是控制器中的 params 方法返回的内容),因此您需要先将其转换为哈希,像这样:

      redirect_to home_path(auth_params.to_h)
      

      【讨论】:

        【解决方案4】:

        你做错了。如果您正在创建资源,那么您应该通过呈现视图来回复验证错误 - 而不是重定向。

        您向用户发送的响应是执行非幂等操作的结果。

        这看起来像是挑剔,但在 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 来执行它。

        【讨论】:

          猜你喜欢
          • 2011-01-02
          • 1970-01-01
          • 2016-11-21
          • 2017-01-24
          • 2017-09-12
          • 2012-03-07
          • 2011-09-28
          • 2011-02-21
          相关资源
          最近更新 更多