2017-06-13 1 views
1

私はRailsプロジェクトでのみ使用されるGemを開発しています。これは、Railsアプリケーションのlibディレクトリ内で開発され、別のGemで抽出されるようになりました。レールに応じてGemコードをロードするタイミング

いくつかのクラスは、ロードされるRailsフレームワークに依存します。二つの例:

class OurGem::Hookup 
    CONFIG_PATH = 'config/hookup.rb'.freeze 
    [...] 
end 

class OurGem::RoutingContainer 
    include Rails.application.routes.url_helpers 
    [...] 
end 

通常、私はrequireを使用して宝石のメインモジュールファイル内の宝石コードをロードします。しかし、これがバンドラーによってロードされるので、Railsは準備ができておらず、Rails.applicationRails.rootのようなものは使用できません。最初の例は、読み込み時にパスを評価しないことで回避できますが、2番目の例はわかりにくいようです。

これを行う正しい方法は何ですか?レールティを使用してイニシャライザを登録し、そこに「微妙な」ファイルが必要ですか?

答えて

2

これは奇妙な設定です。あなたの宝石はあなたの宝石アプリに依存し、あなたの宝石アプリは宝石によって異なります。

これはあまりにも私に似ています。あなたの主なアプリがマウントされている内蔵のrails engineを作成することを検討しましたか?

あなたしかし、これをやって逃げることができるかもしれません:

# Gemfile 
gem 'our_gem', require: false 

# config/initializers/our_gem.rb 
require 'our_gem' 
OurGem::Hookup.config_path = '...' 

これはあなたの宝石のみ後のレールのアプリケーションを初期化をロードされていることを保証します - Rails.application.routes.url_helpersのようなものが定義されますので、 。

+0

あなたの答えをありがとう。まあ、私たちのGemはエンジンの機能(コントローラー、ルートなど)を提供していませんが、ホストアプリケーションのルートを使ってミックスインを提供します。私は、Railsエンジンがこれをどのように手助けするのか正確にはわかりません。 – Remo

関連する問題