首页 > 解决方案 > Rails 控制器处理差异开发/生产

问题描述

摘要:在开发中,请求被路由到workouts_controller.rb但在生产中workouts_controllerPrev.rb

在 Rails 5.2.3 应用程序中,我在文件夹中有第一行workouts_controller.rb的文件:controllers/

WorkoutsController < ApplicationController

我复制了一份workouts_controller.rb(作为快速参考备份),我将其重命名workouts_controllerPrev.rb并保留在controllers/文件夹中。

然后我向workouts_controller.rb. 我在本地测试了新功能(它在开发中按预期工作),然后我部署到 Heroku(v 7.42.0)(用于生产)。

但是,新功能在生产中不起作用。经过一些调试后,我发现在生产中,WorkoutsController classin正在处理对(而不是定义的 in (正如预期和在开发中发生的那样)的workouts_controllerPrev.rb调用。Workouts controllerWorkouts controllerworkouts_controller.rb

我将名称更改为workouts_controllerPrev.rb,将其更改为Xwurkouts_controllerPrev.rb,并将此文件中的类名更改为XWurkoutsController重新部署,并且一切正常。

这里发生了什么?为什么 Rails 在这两个环境之间的功能会有所不同?这是一个错误还是一个没有使用的文件游荡的不良做法的不足为奇的后果?如果是错误,我应该在哪里报告?我在开发中使用 SQLite,在生产中使用 PostGreSQL,但我不认为这可能是数据库问题?生产网络服务器是 Puma。

感谢您的任何指导

丹尼尔

标签: ruby-on-railsheroku

解决方案


问题是这两个文件具有相同的名,因此最后加载的操作(方法)将覆盖第一个加载的操作中定义的操作

如果您想保留这两个文件并且不会产生令人惊讶的结果,请将旧文件中的名更改为其他名称,例如PrevWorkoutsController.

或者,将它保存在 Git 的一个分支中,这样它就不会弄乱你当前的代码。


要回答为什么在不同的环境中得到不同的结果,这是因为自动加载与急切加载之间的差异。Rails 在开发中使用自动加载,但它在生产中预先加载所有内容,然后关闭自动加载

换句话说,在开发过程中,Rails 会在任何时候保存匹配文件时从其匹配文件中重新加载该类。在生产中,它只是简单地预先加载所有文件,因此最后加载的文件将获胜。

你可以在这里阅读更多


推荐阅读