Ruby - 如何访问模块的方法?

时间:2012-10-30 19:30:04

标签: ruby-on-rails ruby module forem

我正在使用Forem gem安装论坛。有一个选项允许头像个性化,因为它可以登录Facebook。您只需在用户模型中指定您的方法就可以了。

# 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帐户。 I've found the method on 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 个答案:

答案 0 :(得分:4)

也许会重新打开这样的模块:

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命名空间

答案 1 :(得分:2)

如果您希望能够在用户类中使用这些方法,请包含它们并使用

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

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

答案 2 :(得分:1)

另一种方法是动态设置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本身。