2012-10-30 176 views
1

我正在安装使用Forem创业板的论坛。有一个选项允许虚拟形象个性化,因为它可以用Facebook登录。您只需在用户模型中指定您的方法即可。Ruby - 如何访问模块的方法?

# Forem initializer 
Forem.avatar_user_method = 'forem_avatar' 

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

但我想要一个正常的,非facebook账户的Gravatar备用。 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 

然而,培训就业部是不是一个实例,而是一个模块,我不能打电话,也没有创建新的实例。简单的方法是复制该方法的行,但这不是重点。有没有办法做到这一点?

感谢

更新

这两个答案都是正确的,但是当我调用该方法无论哪种方式,有这个undefined local variable or method 'request'错误,这是原来的avatar_url的最后一行。

有没有办法像PHP一样全球化这个对象?我是否必须手动将该参数传递给它?

回答

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

+0

感谢您的回答!这是真的,我可以做到这两点,但是没有找到'请求'的问题。另外,重新打开此模块的最佳位置在哪里?我试着把它放在初始化器上,但它触发了一个错误,我认为把它放在控制器上打开它是一个坏主意。 – metrobalderas

+0

好吧,我猜'在你的控制器中包含Forem :: PostsHelper',而不是模型,并且在控制器中做与头像相关的东西,因为它肯定有'request'方法 – 2012-10-30 20:28:44

2

如果你希望能够使用的用户类的方法,包括他们使用

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

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

感谢您的快速回答!然而,原始方法的最后一行触发了这种奇怪的“请求”错误。请检查更新以了解更多详情。 – metrobalderas

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本身。