注销不使用Heroku – 使用Devise gem和Rails 4

我刚刚使用Devise进行身份validation的Rails 4应用程序初始部署到Heroku。 注销在本地工作,但Heroku返回错误“您正在寻找的页面不存在”,并且它不会将用户注销。

根据Heroku日志和Google / SO搜索,看起来原因是Heroku使用的是GET请求而不是DELETE – 尽管我的应用代码指定了链接的:delete方法,而Devise使用DELETE进行签名默认。 有些文章建议Heroku使用GET,以便用户可以在没有启用JavaScript的情况下注销,但我的代码中包含JS include标记,并且在我的浏览器中启用了JS。 (我已经使用Chrome和Safari进行了检查。)

我找到了更改配置的说明,以便Devise使用:get而不是:delete,但我更愿意使用更安全:delete方法,如果可能的话。

感谢到目前为止的想法。 回答你的问题:

这是我的链接:

 

这是我在head标签中加载javascript的内容:

   true %> 

控制台中未报告任何JS错误。

我找到了解决方案。 问题是Rails 4处理资产的方式与Rails 3不同。默认情况下,Rails 4不提供静态资产。 您可以通过设置以下命令在config / application.rb中手动更改此设置:

 config.serve_static_assets = true 

另一个选项(以及Heroku推荐的选项)是使用rails_12factor gem。 将此添加到您的Gemfile并运行bundle install将为您进行调整,并将您的记录器设置为标准输出。 它可以与Rails 3和Rails 4一起使用。

 gem 'rails_12factor', group: :production 

我选择使用gem。 在我运行bundle install之后,提交了更改并重新部署 – 我的注销链接工作正常,无需更改方法。 在此之后我的scss文件也被准确编译和实现。 (我以前没有对这些风格做过任何事情,所以我没有意识到这是一个问题。有趣的是,如何遇到一个新问题可以帮助找到解决方案…)

以下是帮助我的资源:

https://devcenter.heroku.com/articles/rails-4-asset-pipeline

https://github.com/heroku/rails_12factor

您目前无法获得比delete方法更安全的function

Rails实际上必须使用JS设置delete ,因为大多数浏览器都不支持它。 你设置它的方式如下:

 <%= link_to "Logout", user_session_destroy_path, method: :delete %> 

虽然我明白了如何让它更安全,但我认为您应该关注如何在后端处理身份validation。 发送请求只是前端问题; 处理它们是Rails的领域