如何让Rails引擎将文件公开给Rails App Root?

时间:2015-10-28 21:31:25

标签: ruby-on-rails ruby-on-rails-4 rails-engines

我知道在我的Rails引擎中我可以创建一个app/controllers/blah_controller.rb文件,并且可以从我的Rails应用程序访问该控制器,就像它在Rails应用程序本身中定义一样。

如果我希望引擎将文件公开到Rails应用程序的根目录,那么我将它放在Rails引擎中?基本的宝石将具有如下结构:

my_engine
  |_bin
  |_lib
  .gitignore
  my_engine.gempspec
  Gemfile
  Rakefile
  README.md 

我只是将the_file.rb添加到gem的根目录中吗?如果是这样,Rails如何知道包含它而不是gem根中的其他文件?

my_engine
  |_bin
  |_lib
  .gitignore
  my_engine.gempspec
  Gemfile
  Rakefile
  README.md 
  the_file.rb    # I want this file to be present in the Rails app root.

1 个答案:

答案 0 :(得分:1)

No Rails不知道如何加载根路径文件。

您正在寻找的铁路部分是铁路引擎:http://api.rubyonrails.org/classes/Rails/Engine.html

我希望您将引擎安装到应用程序中,以便进行调试。在具有引擎的应用程序中,您可以检查急切加载的路径:

MyEngine::Engine.config.eager_load_paths

返回所有加载路径的数组。

您需要做的就是:配置Engine以加载根路径:

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine
    config.eager_load_paths << File.expand_path('../../..', __FILE__)
  end
end

然后在Rails应用程序中创建一个虚拟初始值设定项,它需要您的引擎根文件:

# /config/initializers/my_engine_dummy.rb
require 'your_engine_root_file.rb'

your_engine_root_file.rb

中放置一些方法
p 'Welcome to my engine`

从rails应用程序加载rails控制台并查看漂亮的消息

假设:

我假设你使用MyEngine作为引擎的命名空间。

建议:

不要这样做:)很多人都知道名称崩溃在软件开发中很常见。因此,您可能希望将引擎文件隔离在命名空间后面。

希望有所帮助