如何在Rails中要求模块

时间:2017-02-27 18:59:09

标签: ruby-on-rails ruby

我有一个名为http_helpers的模块的rails应用程序,它位于app/lib/modules/中,我想在我的控制器中使用模块中的方法。我在考虑要求application_controller.rb中的模块,以便每个控制器都可以访问模块的方法。

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  require "http_helpers"
end

但是我收到了一个错误:

LoadError (cannot load such file -- http_helpers):

我刚开始处理rails的这一方面(或红宝石)并且非常感谢一些建议。

提前致谢!

2 个答案:

答案 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文件夹中。我们使用我们在生产应用程序中使用的框架来执行此操作:

enter image description here

这将允许您在控制器中调用帮助程序,而不会污染应用程序的结构。

-

诀窍是让引擎成为宝石并将其放入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