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.