我有一个名为http_helpers
的模块的rails应用程序,它位于app/lib/modules/
中,我想在我的控制器中使用模块中的方法。我在考虑要求application_controller.rb
中的模块,以便每个控制器都可以访问模块的方法。
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
require "http_helpers"
end
但是我收到了一个错误:
LoadError (cannot load such file -- http_helpers):
我刚开始处理rails的这一方面(或红宝石)并且非常感谢一些建议。
提前致谢!
答案 0 :(得分:2)
您使用Module#include
/ extend
模块,而不是Rails中的文件,因为每个文件(至少app
目录下的文件都已预先加载)。
所以
class ApplicationController < ActionController::Base
include HttpHelpers
protect_from_forgery with: :exception
end
除非您使用的是Rails 5+,否则需要add the folder to the autoload paths:
#config/application.rb:
config.autoload_paths << Rails.root.join('app', 'lib', 'modules')
答案 1 :(得分:0)
如果您使用的是Rails 5+(尚未指定),现在可以使用helpers
method直接在控制器中包含帮助程序:
class ApplicationController < ActionController::Base
def index
helpers.your_http_method
end
end
如果您的模块有特定帮助程序,则应将其转换为引擎,然后将帮助程序放入引擎的app/helpers
文件夹中。我们使用我们在生产应用程序中使用的框架来执行此操作:
这将允许您在控制器中调用帮助程序,而不会污染应用程序的结构。
-
诀窍是让引擎成为宝石并将其放入vendor/gems
- 这样您就可以在Gemfile
中引用它,如下所示:
#Gemfile
gem "your_engine", path: "vendor/gems/your_gem"
如果您决定将功能提取到引擎中(您应该),则设置如下:
# app/vendor/gems/your_engine/lib/engine.rb
module YourEngine
class Engine < Rails::Engine
isolate_namespace YourEngine
end
end
# app/vendor/gems/your_engine/app/helpers/your_engine/http_helpers.rb
class YourEngine::HTTPHelpers
....
end