如何在Rails中加载Ruby Gems?

时间:2011-05-22 08:35:59

标签: ruby-on-rails

假设我有一个我想要使用的红宝石宝石,但只在一个模型或控制器中使用它。

有没有办法专门为那个模型或控制器加载那个gem?

系统范围内可用(可从任何控制器调用)是否浪费资源

3 个答案:

答案 0 :(得分:5)

发布的答案不正确,完全可以只为特定型号或控制器加载宝石。您的Gemfile允许您定义Bundler可用于要求某些宝石的。默认情况下,任何未分组的宝石以及当前运行的环境的宝石都是必需的,并且不需要任何命名组。所以如果你有以下Gemfile:

gem 'always_used_gem', '1.0.0'

group :rarely_used do
  gem 'rarely_used_gem', '1.0.0'
end

然后在初始应用程序加载时不需要rarely_used_gem。如果您有一个需要该功能的特定方法,您可以这样做:

def do_stuff
  Bundler.require :rarely_used
  # use stuff from rarely_used_gem
end

一个注意事项:确保Bundler.require在方法调用中或类似的内容,否则在解析文件时将需要该组(即应用程序启动)

就是否要这样做而言,它应该只用于特殊情况。通过这样做,您可以将启动速度与执行速度进行交易,这在开发中可能有意义,但可能不会在生产中。此外,如果两个宝石之间存在某些不兼容性,您可以使用此方法(例如,我们使用此方法解决几个AWS宝石之间的问题。)

答案 1 :(得分:3)

不,这是不可能的。一旦宝石加载,它将可用于所有控制器/型号/一切。这不应该是您的主要关注点。 RAM和CPU时间很便宜,程序员的时间不是。

答案 2 :(得分:0)

Bundler autoloads / - 需要所有宝石,除非

#Gemfile
gem :somegem, :require => false

然后你可以在需要时提出要求

#some_ruby_file.rb
#within_some_context 
require 'somegem'

它是多么有用以及何时执行此操作(除了加载顺序很重要时,对于mocha gem(需要最后加载)),我不知道。我把这留给你自己的判断。