在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严重依赖于约定。
答案 0 :(得分:10)
所以我不确定你要用你的模块完成什么,但下面是一个快速解决方案来实现它。
require 'my_module'
self.a_method
MyModule.a_method
请勿忘记重启服务器以使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;关于这个话题。