【问题标题】:Rails POST (patch) in development becomes GET in production开发中的 Rails POST(补丁)在生产中变为 GET
【发布时间】:2019-05-05 19:43:51
【问题描述】:

Rails link which POSTs in development GETs in production的情况一样,但是这个问题没有结论,所以我也在尝试:

  • Rails 5.2.3
  • Ruby 2.6
  • 在 Docker 容器中运行
  • Live 应用在 Ubuntu 16.04.6 上

我的观点如下:

<%= link_to '&#10003;'.html_safe, item_path(item), method: :patch, :class=>"item__buy-btn" %>

它会生成以下 HTML:

<a class="item__buy-btn" rel="nofollow" data-method="patch" href="/items/32">✓</a>

这是在我的项目控制器中(我没有项目#show):

def update
  item = Item.find(params[:id])
  item.update(bought: true)
  list = List.find(item.grocery_item_id)
  receipt = Receipt.find(list.receipts.last.id)
  receipt.close
  item.update(grocery_item_id: receipt.id, grocery_item_type: receipt.class.name)
  item.save
  redirect_to request.referrer || root_url
end

这是我的物品相关路线:

                items GET    /items(.:format)                                                                         items#index
                      POST   /items(.:format)                                                                         items#create
             new_item GET    /items/new(.:format)                                                                     items#new
            edit_item GET    /items/:id/edit(.:format)                                                                items#edit
                 item GET    /items/:id(.:format)                                                                     items#show
                      PATCH  /items/:id(.:format)                                                                     items#update
                      PUT    /items/:id(.:format)                                                                     items#update
                      DELETE /items/:id(.:format)                                                                     items#destroy

显然是一个帖子:

日志说 PATCH:

web_1              | Started PATCH "/items/33" for 172.21.0.1 at 2019- 05-05 19:29:31 +0000
web_1              | Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
web_1              | Processing by ItemsController#update as HTML
web_1              |   Parameters: {"authenticity_token"=>"KmPf0fEDEs6Y2gUmC6Su9fdeVOg51AwCUUWyQBq14Gz0Fs6IRJ5cmmQdUETMbE+IMRTTGcfQPQ86x0rNzDSRHg==", "id"=>"33"}

然后在生产中:

I, [2019-05-05T18:27:22.439552 #1]  INFO -- : [93c90971-1378-4e39-b6fb-8329dd46922e] Started GET "/" for 10.255.0.2 at 2019-05-05 18:27:22 +0000
I, [2019-05-05T18:27:22.440379 #1]  INFO -- : [93c90971-1378-4e39-b6fb-8329dd46922e] Processing by HomeController#index as HTML
I, [2019-05-05T18:27:22.441694 #1]  INFO -- : [93c90971-1378-4e39-b6fb-8329dd46922e]   Rendering home/index.html.erb within layouts/application
I, [2019-05-05T18:27:22.443279 #1]  INFO -- : [93c90971-1378-4e39-b6fb-8329dd46922e]   Rendered home/index.html.erb within layouts/application (1.4ms)
I, [2019-05-05T18:27:22.444679 #1]  INFO -- : [93c90971-1378-4e39-b6fb-8329dd46922e] Completed 200 OK in 4ms (Views: 3.0ms)
I, [2019-05-05T18:49:37.971732 #1]  INFO -- : [5f452d24-80c5-44dc-bd8a-cb2be0aa5f14] Started GET "/items/7" for 10.255.0.2 at 2019-05-05 18:49:37 +0000
F, [2019-05-05T18:49:37.973154 #1] FATAL -- : [5f452d24-80c5-44dc-bd8a-cb2be0aa5f14]
F, [2019-05-05T18:49:37.973209 #1] FATAL -- : [5f452d24-80c5-44dc-bd8a-cb2be0aa5f14] AbstractController::ActionNotFound (The action 'show' could not be found for ItemsController):
F, [2019-05-05T18:49:37.973237 #1] FATAL -- : [5f452d24-80c5-44dc-bd8a-cb2be0aa5f14]
F, [2019-05-05T18:49:37.973274 #1] FATAL -- : [5f452d24-80c5-44dc-bd8a-cb2be0aa5f14] actionpack (5.2.3) lib/abstract_controller/base.rb:129:in `process'

什么可能导致这种行为? 我在这篇文章中是否缺少任何相关信息?

编辑:

根据 ser tadmans 的回答,这显然是关于 javascript 的。 由于其中一个文件中的“#”注释,它在预编译时失败。

【问题讨论】:

    标签: ruby-on-rails ruby docker http


    【解决方案1】:

    这通常是因为 Rails UJS JavaScript 库加载失败并且它注入的数据属性被忽略了。

    检查 UJS 库是否已加载。如果您使用的是 Sprockets,请确保存在 application.js 中的 rails-ujs "comment" 行。

    如果您在production 模式下运行,则需要确保您的资产已正确编译。这可以在 Rails 3 到 5.2 的生产部署位置使用 rake assets:precompile 来完成。

    【讨论】:

    • (我可能不小心投了反对票,所以如果你能编辑我可以改变它很好)rake assets:precompile 在产品中。得到以下错误Uglifier::Error: Unexpected character '#' 从咖啡脚本文件中删除了一些剩余的 cmets 解决了它。你是凭经验知道的,还是我应该知道的?这是否意味着我的应用程序会在没有 js 的情况下失败?
    • 这是你需要做的事情来正确“部署”你的应用程序和像Capistrano这样的工具会自动为你做这件事,所以很多人都不知道。大多数部署过程都讨论了这一步,但您需要专门去寻找它们:有几十个操作指南可以详细介绍。每个环境都有自己的挑战,尤其是 Docker。
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2014-10-31
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多