Rails 4模块的未初始化常量

mar*_*cks 38 ruby-on-rails

在一个新的rails 4应用程序中,我得到一个模块的未初始化的常量错误.该模块名为ProcessBill,位于lib/process_bill.rb中

控制台错误:

ActionController::RoutingError (uninitialized constant BillsController::ProcessBill):
Run Code Online (Sandbox Code Playgroud)

控制器代码:

class BillsController < ApplicationController

  include ProcessBill
Run Code Online (Sandbox Code Playgroud)

LIB/process_bill.rb

module ProcessBill
Run Code Online (Sandbox Code Playgroud)

sev*_*cat 71

您是否已将lib添加到自动加载路径?这在Rails 3中是必要的,我不确定它是否仍然需要Rails 4.

尝试将其添加到类定义中config/application.rb-

    config.autoload_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)


小智 37

我在使用Rails 5的lib目录时遇到了这个问题,它出现在生产中但不在开发中.要修复它,您需要将lib目录添加到eager_load_paths.这是我的application.rb中的相关部分:

config.autoload_paths << "#{Rails.root}/lib"
config.eager_load_paths << "#{Rails.root}/lib"
Run Code Online (Sandbox Code Playgroud)

  • 本文解释了原因:http://collectiveidea.com/blog/archives/2016/07/22/solutions-to-potential-upgrade-problems-in-rails-5/ (7认同)

Wou*_*ofs 8

这也适用于您的 application.rb 文件中的 Rails 5:

    config.autoload_paths << Rails.root.join('lib')
    config.autoload_paths << Rails.root.join('lib/notifier')
Run Code Online (Sandbox Code Playgroud)


Aly*_*oss 5

尝试将此行添加到控制器的顶部:

require "#{Rails.root}/lib/process_bill.rb"
Run Code Online (Sandbox Code Playgroud)

  • 小心,这会杀死自动重新加载! (7认同)
  • 您也可以只执行“require 'process_bill',因为`lib` 目录已经在加载路径上。 (3认同)