【问题标题】:rails - access method in app/helpers/xhelper.rb from lib/x.rb filerails - 来自 lib/x.rb 文件的 app/helpers/xhelper.rb 中的访问方法
【发布时间】:2020-03-28 19:03:54
【问题描述】:

我需要访问 app/helpers/xhelper.rb 文件的 xhelper 模块中定义的方法。它需要在 lib 文件夹下的 x.rb 文件中访问。

app/helpers/xhelper.rb 文件如下所示:

module Xhelper
 def method_to_be_used
   p 'ok'
 end
end

lib/x.rb 文件如下所示

require 'xhelper'

class X
include Xhelper
  def x
    method_to_be_used
  end
end

我得到以下错误: 无方法错误: X:Class 的未定义方法“method_to_be_used”

【问题讨论】:

  • 此代码甚至不是有效的 ruby​​。 'xhelper' 不是常量,因为它不是以大写字母开头。你可能会认为我在这里分心,这只是你为这个问题输入的代码,但它对于 NoMethodErrors 非常重要,99% 的时间都是由程序员的草率引起的。当您只是为实际代码创建一个糟糕的替代品时,我们根本没有机会发现实际问题。
  • @max 固定模块名称
  • 它仍然无法重现。 require 'xhelper' 实际上应该引发错误,除非文件位于同一目录中。

标签: ruby-on-rails ruby


【解决方案1】:

问题在于需要文件。

require 需要绝对路径。 我尝试使用require_relative,因为它采用当前路径并开始从该路径搜索文件。而且更干净。

所以在你的情况下 -

xhelper.rb

module Xhelper
  def method_to_be_used
    p 'ok'
  end
end

x.rb

require_relative '../app/helpers/xhelper'

class X
  include Xhelper
  def x
    method_to_be_used
  end
end

阅读 blog 以更深入地了解 ruby​​ 的 require。

【讨论】:

  • 不应该有。我发布了答案,再见在我的机器中生成它。您可以将您的确切类和模块添加到问题中吗?
  • 这里的问题根本不是require。 app/helpers 在 Rails 中自动加载。如果是问题,则错误不会是 NoMethodError,而是缺少常量或文件错误。我猜实际的问题是问题中的代码没有传达的错误。
  • 好吧。我修好了它。 “包括 Xhelper”需要放在 Class 之外。我还不知道为什么。但在网上某处看到了一个例子。我不记得是哪个版本的rails,但是在较新的rails中,似乎不需要require,因为rails可以访问它。在下面发布我的答案。
  • require_relative 语句是必需的 - 似乎。
【解决方案2】:

对我有用的完整答案。

xhelper.rb

module Xhelper
  def method_to_be_used
    p 'ok'
  end
end

x.rb

require_relative '../app/helpers/xhelper'
include Xhelper

class X
  def x
    method_to_be_used
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2015-11-28
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多