Rails模块的未定义方法

gpr*_*ant 9 ruby ruby-on-rails

在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
Run Code Online (Sandbox Code Playgroud)

MyController包括MyModule.而在action,我想用MyModule.a_method(请注意,我也有一个私人a_method的和myController的我并不想用这个.)

我试过的事情:

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

def self.a_method
end
Run Code Online (Sandbox Code Playgroud)

2)::在控制器中使用符号(MyModule::a_method)

我一直得到的错误就是 Undefined method:a_method for MyModule:module 现在,我已经使用了一个不同的名称来模块方法.但我想知道如何使用Module::Module.表示法命名功能

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

jgr*_*aft 13

因此,我不确定您要使用您的模块完成什么,但下面是一个快速解决方案.

  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在您的应用中调用

不要忘记重新启动服务器以使lib/my_module.rb的更改生效.

此外,许多人引用Yehuda Katz的这篇文章作为关于在哪里存储应用程序代码的指导.认为它可能是一个有用的参考.


nic*_*las 7

如果将 MyModule 包含到 MyController 中,第一个的所有“实例方法”将混合到第二个中。

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

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

# my_module.rb
module MyModule 
  def self.a_method
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

应该可以,但是做

# my_module.rb
module MyModule 
  extend self
  def a_method
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

对我来说更干净。您想查看 Rails主动支持关注点,以了解该主题的“Rails 方式”。