【发布时间】:2016-03-04 13:41:54
【问题描述】:
我有一个应用程序在我的本地机器上的开发中运行良好,但是当我在 Heroku 上部署它时出现了一些意外行为。
首先,注销链接停止工作。在开发中,注销链接通过发送 DELETE 请求来工作,该请求被路由到 session#destroy。当您在生产环境中单击链接时,它会将您带到 example.herokuapp.com/logout(由于页面不存在而引发错误),而不是激活 #destroy 操作。
其次,任何其他破坏链接开始表现得像显示链接。和上面的注销链接很相似,只是它显示了要删除的记录,并没有删除。
第三,我有几个自定义操作 #claim 和 #release 都设置为使用 POST http 请求来激活操作。 (这些操作分别将当前用户设置为记录的所有者,或者将记录的所有者设置为 nil)这些都在开发中运行良好,但在生产中却不行。与上面的注销问题类似,在生产环境中单击声明链接会尝试将用户带到 example.herokuapp.com/claim.1(另一个不存在的页面),而不是通过 records#claim 操作声明记录 1。
我做了一些挖掘,发现所有这些问题的根源是在生产中,每个请求都被作为 GET 请求处理。我可以通过切换到 GET 而不是 DELETE 或 POST 来使注销、声明和释放操作起作用,但这是一个肮脏的解决方案,它不会修复 records#destroy 操作。我想 Heroku 可能不喜欢我使用的链接语法,所以我尝试从这里更改链接的语法:
<%= link_to 'Destroy', booking, method: :delete, data: { confirm: 'Are you sure?' } %>
到那个:
<%= link_to 'Destroy', delete_booking_path(booking) data: { confirm: 'Are you sure?' } %>
这些链接既可用于开发,也可用于生产。
开发和生产都使用 Rails 4.2.4 和 ruby 2.2.2p95。当我第一次将项目部署到 Heroku 时使用的是 Ruby 版本 2.0.0,但在这些问题开始后我升级以尝试最小化开发和生产之间的差异。我在开发中使用 SQLite3,而 Heroku 在生产中使用 Postgres。
总的来说,我对开发还很陌生,跟踪开发和生产之间差异的问题对我来说尤其新鲜。我还应该看什么来解决这个问题?你知道任何可能产生这些结果的现象吗?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 heroku