1

我正在使用 Forem gem 安装一个论坛。有一个允许头像个性化的选项,因为可以使用 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

但我想为普通的非 Facebook 帐户使用 Gravatar。我在 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 中那样全球化该对象?我是否必须手动传递该参数?

4

3 回答 3

4

perhaps reopen the module like this:

module Forem
  module PostsHelper
    module_function :avatar_url
  end
end

then call Forem::PostsHelper.avatar_url

if avatar_url call other module methods, you'll have to "open" them too via module_function

or just include Forem::PostsHelper in your class and use avatar_url directly, without Forem::PostsHelper namespace

于 2012-10-30T19:34:49.173 回答
2

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

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

  def forem_avatar
    return user_pic if user_pic.present?
    avatar_url email
  end
end
于 2012-10-30T19:40:33.353 回答
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 本身进行修补。

于 2012-10-30T20:14:27.980 回答