Ruby on rails 在rails 6中,我将文件夹从lib移动到/app,我可以';由于加载路径问题,似乎无法实例化对象

Ruby on rails 在rails 6中,我将文件夹从lib移动到/app,我可以';由于加载路径问题,似乎无法实例化对象,ruby-on-rails,ruby-on-rails-6,Ruby On Rails,Ruby On Rails 6,我有一个新的rails 6应用程序,在lib文件夹中我有以下内容: /lib/some\u app\u name/stripe/subscription/subscription\u service.rb module Someappname # Someappname is also in my application.rb module Stripe class SubscriptionService def initialize(a) @a = a

我有一个新的rails 6应用程序,在lib文件夹中我有以下内容:

/lib/some\u app\u name/stripe/subscription/subscription\u service.rb

module Someappname # Someappname is also in my application.rb 
  module Stripe
    class SubscriptionService
      def initialize(a)
        @a = a
      end
    end
  end
end
然后我将“some_app_name”文件夹移动到:

/app/some\u app\u name/stripe/subscription\u service.rb

module Someappname # Someappname is also in my application.rb 
  module Stripe
    class SubscriptionService
      def initialize(a)
        @a = a
      end
    end
  end
end
我读到,/app中的任何内容都将自动加载并重新加载,所以我搬到了这里。它在/lib中也不起作用

在我的home_controller.rb中,我尝试了以下方法:

ss = Someappname::Stripe::SubscriptionService.new("a")
我得到一个错误,说:

未初始化常量Someappname::Stripe::SubscriptionService


我做错了什么?

我怀疑是弹簧引起的,试试这个

bin/spring stop
然后启动
rails控制台
,停止Spring将迫使
rails
重新加载应用程序

另外,

如果模块名称为
Someappname
,则目录名称应为
app/Someappname
,而不是
some\u app\u name


希望有帮助

Rails会自动加载
/app
下的所有内容,但有一个警告。第一级目录没有成为模块名称的一部分。这就是为什么在
/app/models/User.rb
中可以有
类用户
(而不是
类模型::用户

解决方案:将代码放入
/app
下的某个文件夹中。我通常称之为
/app/lib
/app/custom
之类的

/app/custom/some_app_name/stripe/subscription/subscription_service.rb

(是的,请确保文件路径中的名称正确表示模块路径中的名称。对于模块
Someappname
,您不能使用目录
someappu\u name
,但对于
Someappname
),您可以使用目录
Someappname

出于好奇,您的错误跟踪是否指向zeitwerk?@jvillian不,它没有。有没有一种方法可以使用rails c进行进一步调试?@Blankman先生,您是否尝试重新启动控制台?不确定。如果将完整的错误跟踪包含在question@RajdeepSingh是的,我已重新启动,没有更改。我执行了spring停止,但没有更改,它是否以“rails s”启动?@Blankman如果您的模块名为Someappname,则目录名应为app/Someappname,而不是someapp\u name,你能试着修复吗?问题出在这里,文件夹名是“some_app_name”。我希望模块名为'SomeAppName',但只有当我有'SomeAppName'时它才起作用。有没有办法改变这一点?这看起来很奇怪…@Blankman当然,将模块名称更改为
SomeAppName
,我不认为这会导致任何问题?@Blankman您只需要在名称更改后这样称呼它,
SomeAppName::Stripe::SubscriptionService.new(“a”)