Rails 5使用强参数重定向

时间:2017-12-28 22:00:02

标签: ruby-on-rails ruby-on-rails-5 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方法上出错而不是重定向本身

4 个答案:

答案 0 :(得分:0)

home_path和其他url_for相关的方法需要一个Hash对象而不是ActionController::Parameters对象(这是控制器中的params方法返回的)所以你需要首先将它转换为哈希,如下所示:

redirect_to home_path(auth_params.to_h)

答案 1 :(得分:0)

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

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

我希望这对你有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您做错了。如果您正在创建资源,则应该通过渲染视图(而不是重定向)来回复验证错误。

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

这似乎很挑剔,但是在GET参数中向用户发送电子邮件和选择的密码非常鲁ck。

如果您要在首页中嵌入表单,只需创建一个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来执行它。