簡體   English   中英

gemfile中包含的gem仍需要在類文件中“包含”嗎?

[英]gem included in gemfile still requires “include” in class file?

我在我的Gemfile中包含了用於aasm的gem( https://github.com/aasm/aasm ),並運行bundle install多次。 但是,直到我在文件中添加“ include AASM”(尤其是user.rb),插件的命令才起作用。 為什么是這樣? 我想不出為什么我仍然需要這樣做的任何原因-這不是捆綁器的全部重點嗎?

Bundler和Gemfile負責下載代碼,並將其提供給您的應用程序。 通常通過使用require來完成。

編寫include AASM將狀態機功能添加到您的User類。

許多Ruby gem都是這樣工作的:bundler需要使用gem,它將代碼加載到應用程序中,然后單獨使用include將功能添加到特定模型,控制器等中。

您需要了解以下幾個概念:

在Rails中,Gemfile包含您希望捆綁程序下載並可用於您的應用程序的庫(寶石)。 它們在Rails中自動可用,與在獨立的Ruby程序中一樣,您需要為每個要使用的庫使用“ require”命令。 'require'實際運行所需的文件(與C ++中的'#include'指令和Java中的'import'相同,但又不完全相同)。 所需文件可能添加了某種全局功能,也可能沒有。 使用AASMgem,並非所有類都需要該功能,因此您可以決定哪些類可以將其用於...

Ruby命令“ include”允許您從模塊(在以下示例中為模塊ASM)“混合”功能,請參見: https : //github.com/aasm/aasm/blob/master/lib/aasm/aasm.rb )。 請查看AASM文檔中的以下示例:

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”之前,Job類中不存在“ aasm”方法。 這也意味着其他類不會自動具有AASM方法(這使Object名稱空間保持干凈)。

使用'require'命令在所有類中獲得功能的唯一方法是是否必需的文件猴子補丁對象(很少這樣做,因為這樣做很危險),否則,通常會給您一種新的提示。要使用的類或模塊中包含的方法集合,您可以將其混入自己的類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM