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

时间:2009-08-31 02:55:19

标签: ruby-on-rails module

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

class Show < ActiveRecord::Base
  include Utilities

   ...
   def self.something
      fix_url("www.google.com")
   end
end

我的实用工具文件位于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。在模型中包含模块时,是否必须做一些不同的事情?

谢谢!

2 个答案:

答案 0 :(得分:4)

尝试通过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.

显式调用方法

答案 1 :(得分:1)

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

编辑:如果您只想致电Utilities.fix_url,您可以这样做 - 不需要包含/扩展。