Rails + Gems(一般):宝石是如何工作的?

时间:2013-04-10 18:24:10

标签: ruby-on-rails

我一直在使用Rails并且一直在我的gemfile中使用gems,但我从未真正理解我安装的gem的功能实际上是如何可用的。假设我使用has_permalinks gem(http://haspermalink.org/)。它为我的模型提供了.generate_permalink!方法。这个方法在哪里定义?为什么我只能通过安装gem来突然使用这种方法?是否有某种include / require / load来初始化gem的代码,以便其他应用程序可以访问它?另外,当我安装gem时,这个代码存储在哪里?

1 个答案:

答案 0 :(得分:14)

我单独回答了你的问题,而且没有按顺序,但我认为这实际上可能会让你更容易理解这个顺序的答案。

  

此外,安装gem时,这段代码存储在哪里?

如果你正在使用Bundler,你可以bundle show has_permalink,它会告诉你宝石的安装位置。以下是我使用pg gem:

进行此操作的示例
✗ bundle show pg
/Users/jasonswett/.rvm/gems/ruby-1.9.2-p320@jason/gems/pg-0.11.0
  

这个方法在哪里定义?

如果你执行bundle show事情,它会返回一个路径 - 该方法在那里定义。 (您可以使用grep -r 'def generate_permalink' /gem/path找到您想要的确切位置。)

  

为什么我只能通过安装突然使用这种方法   宝石?是否有某种include / require / load来初始化   宝石的代码,以便其他人可以访问   应用

查看有关Rails初始化过程的文档的这一部分: http://guides.rubyonrails.org/initialization.html#config-boot-rb

  

在标准的Rails应用程序中,有一个声明all的Gemfile   应用程序的依赖关系。 config / boot.rb设置   ENV [“BUNDLE_GEMFILE”]到这个文件的位置,然后需要   Bundler并调用Bundler.setup,它添加了依赖项   应用程序(包括所有Rails部分)到加载路径,制作   它们可供应用程序加载。

看起来,在这个过程的早期阶段,Rails会查看你的Gemfile并通过Bundler加载你所有的宝石。所以有你的包括。