Rails模块的未定义方法

时间:2014-11-25 02:15:49

标签: ruby-on-rails ruby

在Rails中,如何使用模块中的特定方法。例如,

# ./app/controllers/my_controller.rb
class MyController < ApplicationController
  include MyModule 

  def action
    MyModule.a_method
  end

  private
  def a_method
    ...
  end
end

# ------------------------------------------------ #

# ./app/helpers/my_module.rb
module MyModule 
  def a_method
    ...
  end
end

MyController包含MyModule。在action中,我想使用MyModule.a_method(请注意我在MyController中也有一个私人a_method而我想要使用此功能。)

我尝试的事情:

1)将模块中的方法定义为self.

def self.a_method
end

2)在控制器中使用::表示法(MyModule::a_method

我不断得到的错误是 Undefined method:a_method for MyModule:module 目前,我已经使用了不同的名称来模块方法。但是我想知道如何使用Module::Module.符号来命名函数

[更新 - 2014年11月24日] 在代码中添加文件结构,因为Rails严重依赖于约定。

2 个答案:

答案 0 :(得分:10)

所以我不确定你要用你的模块完成什么,但下面是一个快速解决方案来实现它。

  1. 将my_module.rb移出帮助程序并移入lib / my_module.rb。帮助程序目录适用于视图中使用的方法。惯例是利用在其各自的控制器之后命名空间的帮助程序或用于视图的全局方法的application_helper.rb。不确定这是不是你想用你的模块完成的,但是想把它扔出去。
  2. 在config / initializers / custom_modules.rb中创建一个初始值设定项(无论如何)并添加require 'my_module'
  3. 将a_method更新回self.a_method
  4. 您现在可以在应用中致电MyModule.a_method
  5. 请勿忘记重启服务器以使lib / my_module.rb更改生效。

    此外,许多人引用了Yehuda Katz的this post作为关于在哪里存储应用代码的指导。认为它可能是一个有用的参考。

答案 1 :(得分:2)

如果你将MyModule包含在MyController中,所有&#34;实例方法&#34>第一个将混入第二个。

因此,如果您只想调用MyModule.a_method,不需要来包含您的模块。

然后,您希望在使用之前要求(或更好地自动加载)您的模块。为此,将它放在controllers / concerns / my_module.rb中,rails(至少4个)应该自动加载它,否则需要在初始化器中使用它的文件

# my_module.rb
module MyModule 
  def self.a_method
    ...
  end
end

应该有效,但是

# my_module.rb
module MyModule 
  extend self
  def a_method
    ...
  end
end

对我来说更干净。您希望了解导轨active support concern以了解导轨方式&#34;关于这个话题。