我有一个模型,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。在模型中包含模块时,是否必须做一些不同的事情?
谢谢!
答案 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
,您可以这样做 - 不需要包含/扩展。