1

Foremgemを使用してフォーラムをインストールしています。Facebookでログインできるので、アバターのパーソナライズを可能にするオプションがあります。ユーザーモデルでメソッドを指定するだけで、それだけです。

# 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

おそらく次のようにモジュールを再度開きます。

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

于 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 に答える