繁体   English   中英

如何使Rails引擎向Rails应用程序根目录公开文件?

[英]How to make a Rails engine expose a file to the Rails App Root?

我知道我可以在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.

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

您正在寻找的Rails部分是Railtie引擎: 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作为引擎的命名空间。

建议:

不这样做:)众所周知,名称折叠在软件开发中很常见。 因此,您可能想将引擎文件隔离在命名空间的后面。

希望能有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM