如何从我的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
您可以这样做 – 不需要包含/扩展。