gemfile中包含的gem仍然需要在类文件中使用“include”?

时间:2014-12-12 06:04:15

标签: ruby-on-rails ruby gem

我在我的Gemfile中包含了aasm(https://github.com/aasm/aasm)的gem,并且运行了很多次bundle install。但是,插件中的命令不会起作用,直到我添加"包括AASM"到我的文件(特别是user.rb)。为什么是这样?我无法想出为什么我仍然需要这样做 - 这不是捆绑者的全部意义吗?

2 个答案:

答案 0 :(得分:1)

Bundler和Gemfile负责下载代码,并将其提供给您的应用。这通常使用require完成。

编写include AASM会将状态机功能添加到User类。

许多Ruby宝石以这种方式工作:bundler需要gem,它将代码加载到应用程序中,然后单独使用include将功能添加到特定模型,控制器等。

答案 1 :(得分:1)

您需要了解一些有关此处发生的事情的概念:

在Rails中,Gemfile包含您希望bundler下载并提供给您的应用程序的库(gems)。这些在Rails中自动可用,在独立的Ruby程序中,您需要为每个要使用的库使用'require'命令。 'require'字面上运行所需的文件(类似但与C ++中的'#include'指令和Java中的'import'完全相同)。所需文件可能会添加某种全局功能,也可能不会。使用AASMgem,所有类中都不需要该功能,因此您可以决定将哪些类用于...

Ruby命令'include'允许您从模块中混合“功能”(以下示例中的模块AASM,请参阅:https://github.com/aasm/aasm/blob/master/lib/aasm/aasm.rb)。请查看AASM doc中的以下示例:

require 'aasm'

class Job
  include AASM

  aasm do
    state :stage1, :initial => true
    state :stage2
    ...
  end
end

因此,Rails中不需要'require'语句,因为Rails已经为您提供了库。 'include'语句将状态机方法混合到Job类中。特别是在这个例子中,它为您提供了'aasm'方法(这是一个方法,您使用'do'传递一个块)。 'aasm'方法执行一些操作,并执行块(在此示例中也使用AASM特定的'state'方法)。

与原始问题相关的要点是,在“包含AASM”之前,“Aasm”方法在Job类中不存在。这也意味着,其他类不会自动拥有AASM方法(使Object名称空间保持干净)。

使用'require'命令在所有类中获取功能的唯一方法是,如果所需的文件猴子补丁对象(这很少做,因为它可能很危险),否则,通常会给你一个要使用的新类或模块中包含的方法集合,您可以将它们混合到您自己的类中。