【问题标题】:Organizing files in lib directory在 lib 目录中组织文件
【发布时间】:2012-06-30 15:08:41
【问题描述】:

我正在尝试将我的 Rails 项目的一部分提取到我的 lib 目录中,但我不知道如何正确链接我的文件。我的目录结构如下:

lib/
  eventable/
    calendar.rb
    helpers.rb
# Rest of rails directories/files

我需要config/application.rb 中的可事件目录:

config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/eventable)

我的助手和日历 rb 文件:

# helpers.rb
module Eventable
  module Helpers
    def calendar_for...
      Calendar.new...
    end
  end
end

# calendar.rb
module Eventable
  class Calendar
    # methods defined here
  end
end

然后我将 Eventable::Helpers 模块混合到常规 Rails 助手中,以便我可以在我的视图中使用 calendar_for

ActionView::Base.send :include, Eventable::Helpers

这最后一步似乎工作正常。但是,当我转到使用此助手的视图时,我得到:

uninitialized constant Eventable::Helpers::Calendar

如果我更改我的助手以便它尝试访问Eventable::Calendar.new,那么我会得到:

uninitialized constant Eventable::Calendar

当我将所有这些都放在一个文件中时,一切都很完美。那么如何正确链接这些文件呢?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    看起来您需要一个加载器类型的文件来告诉 Rails 在哪里可以找到 Eventable 模块的代码。

    尝试添加lib/eventable.rb

    module Eventable
      autoload :Calendar, 'eventable/calendar'
      autoload :Helpers, 'eventable/helpers'
    end
    

    如果您有加载程序文件,则不需要更改加载路径。

    【讨论】:

    • 谢谢,我已尝试创建该文件,但出现以下错误:cannot load such file -- eventable/calendar。有什么想法吗?
    • 您使用的是哪个版本的 Ruby?要尝试的几件事是将“.rb”添加到自动加载中,或者将 lib/eventable 路径从加载路径中取出。只要在你的加载路径中有 lib 目录,它应该会选择 eventable.rb 加载器。
    • 我正在使用 ruby​​ 1.9.3p125 并尝试从我的加载路径中删除事件目录(即现在只有 lib 目录)并尝试使用 '.rb' 但都给了我同样的错误.瓦瓦的回答对我有用。感谢您的帮助!
    • 也感谢您向我介绍加载器类型文件的概念
    • 我不确定这是否是它的官方术语——但这就是它的想法。加载 gem 时使用相同的概念,请参阅 github.com/plataformatec/simple_form/blob/master/lib/…
    【解决方案2】:

    我遇到了类似的问题。我通过改变需要模块的方式解决了这个问题。

    application.rb

    config.autoload_paths += Dir["#{config.root}/lib/"]
    

    使用以下代码创建 /lib/eventable.rb

    require "eventable/helpers"
    require "eventable/calendar"
    

    【讨论】:

    • 感谢这工作。你知道为什么这是必要的吗?是因为自动加载无法以正确的顺序加载它们吗?或者因为我从视图助手中使用 Calendar 类这一事实不足以告诉 Rails 该类需要自动加载(即,当它到达那里时,为时已晚?)
    • 我认为这与订单或助手无关。问题来自Ruby。模块位置应该与您所做的那样与目录结构匹配,但是当直接从子目录中需要它们时,它会引发错误。看看这个:Best practice for Ruby require.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多