访问 Rails lib 文件夹中的模块
Accessing modules in Rails lib folder
这里可能有数百个这样的问题,但我还没有找到一个来解决。我正在使用 Rails 6,但在编写自定义模块时总是遇到问题。
我有一个用于创建电子邮件令牌的文件: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::EmailToken
调用它: create_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 已经自动加载应用程序文件夹的任何子目录*。
/lib
自 Rails 以来就没有出现在自动加载路径上 3. 如果要将其添加到自动加载路径中,则需要添加 /lib
而不是 /lib/account_management
到 autoload/eager 加载路径。在 Zeitwerk 术语中,这添加了一个根,Zeitwerk 将从中索引和解析常量。
config.autoload_paths += config.root.join('lib')
config.eager_load_paths += config.root.join('lib')
请注意,eager_load_paths 仅在开启预先加载时使用。它在开发中默认关闭以启用代码重新加载。
/lib
添加到 $LOAD_PATH
因此您也可以手动要求文件:
require 'account_management/email_token'
参见:
这里可能有数百个这样的问题,但我还没有找到一个来解决。我正在使用 Rails 6,但在编写自定义模块时总是遇到问题。
我有一个用于创建电子邮件令牌的文件: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::EmailToken
调用它: create_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 已经自动加载应用程序文件夹的任何子目录*。
/lib
自 Rails 以来就没有出现在自动加载路径上 3. 如果要将其添加到自动加载路径中,则需要添加 /lib
而不是 /lib/account_management
到 autoload/eager 加载路径。在 Zeitwerk 术语中,这添加了一个根,Zeitwerk 将从中索引和解析常量。
config.autoload_paths += config.root.join('lib')
config.eager_load_paths += config.root.join('lib')
请注意,eager_load_paths 仅在开启预先加载时使用。它在开发中默认关闭以启用代码重新加载。
/lib
添加到 $LOAD_PATH
因此您也可以手动要求文件:
require 'account_management/email_token'
参见: