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