Greg Yang

Developer

Taipei, Taiwan
108 POSTS
35 TAGS

若要查看是否有载入请在rails c输入这行ActiveSupport::Dependencies.autoload_paths ORRails.application.config.assets.paths即可

> rails c
> ActiveSupport::Dependencies.autoload_paths
[
    [ 0] "/Users/app/assets",
    [ 1] "/Users/app/channels",
    [ 2] "/Users/app/controllers",
    [ 3] "/Users/app/controllers/concerns",
    [ 4] "/Users/app/helpers",
    [ 5] "/Users/app/jobs",
    [ 6] "/Users/app/mailers",
    [ 7] "/Users/app/models",
    [ 8] "/Users/app/models/concerns",
    [ 9] "/Users/app/uploaders",
我们需要的是载入这行 -> [10] "/Users/lib/modules",
    [11] "/Users/.rvm/gems/ruby-2.3.1/gems/devise-4.4.1/app/controllers",
    [12] "/Users/.rvm/gems/ruby-2.3.1/gems/devise-4.4.1/app/helpers",
    [13] "/Users/.rvm/gems/ruby-2.3.1/gems/devise-4.4.1/app/mailers",
    [14] "/Users/.rvm/gems/ruby-2.3.1/gems/font-awesome-rails-4.7.0.3/app/assets",
    [15] "/Users/.rvm/gems/ruby-2.3.1/gems/font-awesome-rails-4.7.0.3/app/helpers",
    [16] "/Users/.rvm/gems/ruby-2.3.1/gems/material_icons-2.2.1/app/assets",
    [17] "/Users/.rvm/gems/ruby-2.3.1/gems/material_icons-2.2.1/app/helpers",
    [18] "/Users/.rvm/gems/ruby-2.3.1/gems/material_icons-2.2.1/app/models",
    [19] "/Users/test/mailers/previews"
]

Controller 里使用

def add_to_cart
  extend CommonHelper
  current_cart.add_product_to_cart(@product)
end

View 里使用

大专栏  use mixin and autoload_paths vs eager_load_pathslanguage-erb highlighter-rouge">
<% extend CommonHelper %>
  • include 提供了混合它的Class的实例方法。(动态使用)
  • extend 扩展为混合Class提供类方法。(静态使用)
  • 建议使用 extend 取代 include 这样就不用include 在 new 了
    extend or include
    extend include 解说

    autoload_paths 以及 eager_load_paths使用方式

    autoload_paths在 Rails版本 < 5以下做使用以下任一种方式即可使用 in config/application.rb

    config.autoload_paths += Dir["#{config.root}/lib/**"]
    config.autoload_paths += %W(#{config.root}/lib/modules)
    

    eager_load_paths 在 Rails版本 >= 5使用以下任一种方式即可使用,in config/application.rb

    config.eager_load_paths << "#{Rails.root}/lib/modules"
    config.eager_load_paths += %W(#{config.root}/lib/modules)
    config.eager_load_paths += %W(
    #{config.root}/lib/modules
    #{config.root}/lib/my_others
    )
    


上production因安全所需会自动取消autoload_paths,所以在此建议使用eager_load_paths 上production会比以较不会发生异常。
总结:autoload_paths就是当使用某个常量(比如module class时),rails会调用const_missing,然后在autoload_paths的数组目录中查找,找到该常量后加载使用。简单认为,在使用时,才加载相关代码。 优点:能够快速激活rails,在激活rails时减少加载代码,在使用时临时加载进来。eager_load_paths在rails激活时,就把eager_load_paths中的目录代码加载进来.production环境时建议使用,eager_load_paths加载。这样虽然激活的 时候速度会变慢,因为要加载更多代码,但是,这样加载预热后,在用户使用进程时,就能很快的调用到相关代码,因为已经在激活的时候加载好了。 关于lib目录中的代码文档根据实际情况需要,选择加载方式。

Related Posts

12-27 00:53
查看更多