[英]How do Ruby Gems Load in Rails?
假设我有一个要使用的红宝石宝石,但是仅在一个模型或控制器中需要使用它。
有没有办法专门为那个模型或控制器加载该gem?
使其在系统范围内可用(从任何控制器调用)会浪费资源吗?
发布的答案不正确,完全有可能只为特定型号或控制器加载gem。 你的Gemfile允许您定义捆扎机可以使用需要一定的宝石集团 。 默认情况下,所有未分组的gem以及当前正在运行的环境的gem都是必需的,并且不需要任何命名的组。 因此,如果您具有以下Gemfile:
gem 'always_used_gem', '1.0.0'
group :rarely_used do
gem 'rarely_used_gem', '1.0.0'
end
这样rarely_used_gem
来,在初始应用程序加载时就不需要rarely_used_gem
。 如果您有需要该功能的特定方法,则可以执行以下操作:
def do_stuff
Bundler.require :rarely_used
# use stuff from rarely_used_gem
end
请注意:请确保Bundler.require位于方法调用之内或类似的方法内,否则在分析文件(即应用程序启动)时将需要该组
就是否要执行此操作而言,它实际上仅应用于特殊情况。 通过这样做,您将启动速度与执行速度进行了交换,这在开发中可能有意义,但在生产中可能没有意义。 另外,如果两个gem之间存在一些不兼容,则可以使用此方法(例如,我们使用它来解决几个AWS gem之间的问题。)
不,不可能。 一旦宝石被加载,它将可用于所有控制器/型号/所有物品。 这对您来说不是主要问题。 RAM和CPU时间便宜,程序员的时间却不然。
捆绑器自动加载/需要所有宝石,除非
#Gemfile
gem :somegem, :require => false
然后您可以在需要时执行它
#some_ruby_file.rb
#within_some_context
require 'somegem'
我不知道它的用处以及何时执行(除了加载顺序很重要时,如摩卡宝石(需要最后加载))。 我将根据您自己的判断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.