访问Rails lib文件夹中的模块



这里可能有数百个这样的问题,但我还没能找到一个。我使用的是Rails6,在编写自定义模块时总是遇到麻烦。

我有一个用于创建电子邮件令牌的文件:lib/account_management/email_token.rb

module AccountManagement
module EmailToken
def create_email_token(user)
....
end
end
end

然后在我的控制器中,我尝试了各种各样的东西:require 'account_management/email_token'include AccountManagement::EmailTokencreate_and_send_email_token(user)调用

有一次我添加了config.eager_load_paths << Rails.root.join('lib/account_management/'),但我认为你不必这么做。

每当我试图调用控制器操作时,我都会收到几个错误消息之一:

*** NameError Exception: uninitialized constant Accounts::SessionsController::EmailToken
#this happens if I try to manually send through the rails console 
(although inside of a byebug I can call require 'account_management/email_token' and it returns
true.

最常见的情况是:

NoMethodError (undefined method `create_email_token' for #<Accounts::SessionsController:0x00007ffe8dea21d8>
Did you mean?  create_email):
# this is the name of the controller method and is unrleated.

解决此问题的最简单方法是将文件放在app/lib/account_management/email_token.rb中。Rails已经自动加载了应用程序文件夹*的任何子目录。

自Rails3以来,/lib就没有出现在自动加载路径上。如果要将其添加到自动加载路径,则需要将/lib而不是/lib/account_management添加到自动装载/紧急装载路径。在Zeitwerk术语中,这添加了一个根,Zeitwer克将从中索引和解析常量。

config.autoload_paths += config.root.join('lib')
config.eager_load_paths += config.root.join('lib')

请注意,eager_load_path仅在启用急切加载时使用。在开发过程中,它默认会关闭,以启用代码重新加载。

/lib已添加到$LOAD_PATH中,因此您也可以手动要求使用以下文件:

require 'account_management/email_token'

参见:

  • 自动加载和重新加载常量(Zeitwerk模式(
  • 轨道#37835

相关内容

  • 没有找到相关文章

最新更新