Как правильно включить модуль и вызвать функции модуля из моей модели Rails? - PullRequest
1 голос
/ 31 августа 2009

У меня есть модель, Шоу и модуль Утилиты

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

Но Rails выдает NoMethodError для "fix_url", когда я вызываю его в моем классе показа. Нужно ли делать что-то другое, когда в мою модель включен модуль?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 31 августа 2009

попробуйте ввести этот миксин через extend вместо include. По сути, потому что вы вызываете метод mixin из метода класса, но включение mixin делает доступными только его методы экземпляра. Вы можете использовать расширенный стиль, чтобы получить методы класса.

Поиск по Ruby включает и расширяет, чтобы узнать различия. Обычный пример - сделать это так:

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

Где вы используете хук included для смешивания методов уровня экземпляра и класса.

@ Тони - это работает для меня

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 голос
/ 31 августа 2009

Это сработало для меня. Вы пытались перезапустить сеанс сервера / консоли?

Редактировать: Если вы хотите просто позвонить Utilities.fix_url, вы можете сделать это - не нужно включать / расширять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...