2013-04-10 8 views
10

私はRailsをしばらく使っていて、いつも私のgemfileに宝石を使っていましたが、私が実際にインストールした宝石の機能がどのように利用可能になったのかは決して分かりませんでした。 has_permalinksの宝石(http://haspermalink.org/)を使用しています。私のモデルには.generate_permalink!メソッドがあります。このメソッドはどこで定義されますか?どのように私は宝石をインストールするだけで突然この方法を使用することができますか? include/require/loadの宝石のコードを初期化してアプリケーションの残りの部分にアクセスできるようにするのですか?また、私は宝石をインストールするときにこのコードがどこに保存されていますか?Rails + Gems(一般):宝石はどのように機能しますか?

答えて

14

私はあなたの質問に別々に、順不同で答えましたが、実際にはこの順番で回答を理解しやすくするかもしれないと思います。

また、このコードは、宝石をインストールするとどこに保存されますか?

Bundlerを使用している場合は、bundle show has_permalinkを実行すると、その宝石がインストールされている場所が表示されます。ここでpg宝石でそれをやって、私の例です:

このメソッドが定義されますん
✗ bundle show pg 
/Users/jasonswett/.rvm/gems/[email protected]/gems/pg-0.11.0 

bundle showの場合は、パスが返されます。メソッドはそこに定義されています。 (あなたがしたい場合は、場所を正確に見つけることgrep -r 'def generate_permalink' /gem/pathを使用することができます。)

どのように私はちょうど 宝石をインストールすることによって、この方法に突然のすべてを使用することができます来ますか? gemのコードを初期化して、 アプリケーションの残りの部分にアクセスできるようにするために、include/require/loadのようなものがありますか? Railsの初期化プロセスに関するドキュメントのこの部分で

ルック:標準のRailsアプリケーションで http://guides.rubyonrails.org/initialization.html#config-boot-rb

、アプリケーションのすべての の依存関係を宣言しGemfileがあります。 config/boot.rbはこのファイルの場所に ENV ["BUNDLE_GEMFILE"]を設定し、 Bundlerが必要で、 アプリケーション(すべてのRailsの部分を含む)の依存関係をロードパスに追加するBundler.setupを呼び出し、 をロードしてアプリケーションに使用できます。

かなり早い段階で、RailsはあなたのGemfileを見て、Bundler経由ですべての宝石を読み込みます。だからあなたのインクルードがあります。