如何从我的Rails模型中正确包含模块和调用模块函数?

我有一个模型,Show和一个模块Utilities

class Show < ActiveRecord::Base include Utilities ... def self.something fix_url("www.google.com") end end 

My Utilities文件位于lib / utilities.rb中

 module Utilities def fix_url(u) !!( u !~ /\A(?:http:\/\/|https:\/\/)/i ) ? "http://#{u}" : u end end 

但是当我在show class中调用它时,Rails会为“fix_url”抛出一个NoMethodError。 在模型中包含模块时,是否必须做一些不同的事情?

谢谢!

尝试通过extend而不是include注入mixin。 基本上,因为您从类方法调用mixin方法,但包含mixin只使其实例方法可用。 您可以使用extend样式来获取类方法。

搜索Ruby包括并扩展以了解差异。 一个常见的模式是这样做:

http://www.dcmanges.com/blog/27

在哪里使用included钩子来混合实例和类级别方法。

@Tony – 这适合我

 class User < ActiveRecord::Base extend Utilities def self.test go() end end module Utilities def go puts "hello" end end From console: >> User.test hello => nil 

在任何时候我都不必使用self.显式调用方法self.

它对我有用。 您是否尝试重新启动服务器/控制台会话?

编辑:如果您只想调用Utilities.fix_url您可以这样做 – 不需要包含/扩展。