Ruby - Как получить доступ к методам модуля?

Я устанавливаю форум, используя драгоценный камень Forem. Есть опция, позволяющая персонализировать аватара, так как можно войти через Facebook. Вы просто указываете свой метод в модели User и все.

# Forem initializer
Forem.avatar_user_method = 'forem_avatar'

# User model
def forem_avatar
  unless self.user_pic.empty?
    self.user_pic
  end
end

Но я хочу использовать Gravatar для обычных аккаунтов, не принадлежащих Facebook. Я нашел метод на Forem и в теории мне нужно вызвать avatar_url метод:

# User model
def forem_avatar
  unless self.user_pic.empty?
    self.user_pic
  else
    Forem::PostsHelper.avatar_url self.email
  end
end

Однако Forem - это не экземпляр, а модуль, и я не могу ни вызвать его, ни создать новый экземпляр. Самый простой способ - скопировать строки этого метода, но это не главное. Есть ли способ сделать это?

Спасибо

Обновить

Оба ответа верны, но когда я вызываю метод в любом случае, это undefined local variable or method 'request' ошибка, которая является последней строкой оригинала avatar_url,

Есть ли способ глобализации этого объекта, как в PHP? Должен ли я вручную передать этот аргумент?

3 ответа

Решение

Возможно, снова откройте модуль следующим образом:

module Forem
  module PostsHelper
    module_function :avatar_url
  end
end

затем позвоните Forem::PostsHelper.avatar_url

если avatar_url вызовите другие методы модуля, вам придется их тоже "открыть" через module_function

или просто include Forem::PostsHelper в вашем классе и использовать avatar_url прямо, без Forem::PostsHelper Пространство имен

Если вы хотите использовать эти методы в пользовательском классе, включите их и используйте

class User < ActiveRecord::Base
  include Forem::PostsHelper

  def forem_avatar
    return user_pic if user_pic.present?
    avatar_url email
  end
end

Другим способом было бы установить Forem.avatar_user_method динамически, так как код Forem проверяет его, он существует до его использования и по умолчанию avatar_url если это не так.

class User < ActiveRecord::Base

  # This is run after both User.find and User.new
  after_initialize :set_avatar_user_method

  # Only set avatar_user_method when pic is present
  def set_avatar_user_method
    unless self.user_pic.empty?
      Forem.avatar_user_method = 'forem_avatar'
    end
  end

  def forem_avatar
    self.user_pic
  end
end

Таким образом, вы не загрязняете свою модель ненужными методами от Forem и не исправляете сам Forem.

Другие вопросы по тегам