1

モデルの 1 つから gravatar_for を呼び出そうとしています。(はい、これは厳密には MVC ではないことを認識していますが、それを行う正当な理由がありますが、それについては説明しません)。Gravatar のヘルパーを含めようとしていますが、それらが何であるかを見つけることができませんでした。

これまでのところ、私のクラス内にそれを含めてもうまくいきません:

class AnnotationPostedActivity < NewsfeedActivity
  include GravatarHelper::PublicMethods
4

2 に答える 2

4

gravatar-pluginを使用して画像タグを生成すると仮定すると、克服すべき問題がいくつかあります。このgravatar_forメソッドは、最初の引数としてユーザー オブジェクトを取ることに注意してください。

クラスに混在するGravatarHelper::PublicMethodsと、AnnotationPostedActivityすべてのインスタンスがメソッドにアクセスできるようになりますgravatar_for(user, options={})。だからあなたは言うでしょう:

alice = User.new()

alice.respond_to?(:gravatar_for)
=> true

alice.gravatar_for
ArgumentError: wrong number of arguments (0 for 1)
# (you need to supply an argument - the method got zero but was expecting one)

alice.gravatar_for(alice)
=> "<img class=\"gravatar\" alt=\"\" width=\"50\" height=\"50\" src=\"http://www.gravatar.com/avatar/70375a32ad79987b9bc00cb20f7d1c95?rating=PG&amp;size=50\" />
 # (not what we want at all)

userメソッドの最初の引数としてオブジェクトを指定する必要がありますgravatar_for。だからあなたがしなければならないことは

1. 別のジェムを使用する

self.emailメソッドパラメータとして要求するのではなく、見るモジュールを提供するもの。

2. メソッドを自分で実装する

簡単です。そして従うべきルビーコードはすでにあります。モデルに Rails のヘルパーをいくつか含める必要があるでしょうAnnotationPostedActivity

>> gravatar_url 'github@deanandadie.net`
NoMethodError: undefined method `h' for main:Object ....

>> require 'active_support/core_ext/string/output_safety'
=> true

>> include ERB::Util
=> Object

>> gravatar_url 'github@deanandadie.net`
=> "http://www.gravatar.com/avatar/fbaf55d6c2618cafe0a759cfe85967e0?rating=PG&size=50"
于 2012-07-12T05:20:28.507 に答える
1

これがモデルに混ぜようとしているヘルパーモジュールである場合、これは物事を少し動かす必要があるというシグナルです。ヘルパーは実際にはビューヘルパーであり、ビューからのみ呼び出す必要があります。モデル自体にも役立つロジックがある場合は、それをlibに移動します。例えば:

# lib/gravatar_utils.rb
module GravatarUtils
  def gravatar_for(user)
    # ...
  end
end

# app/helpers/gravatar_helper.rb
class GravatarHelper
  include GravatarUtils

  def gravatar_image_tag(user)
    url = gravatar_for(user)
    # ...
  end
end

# app/models/annotation_posted_activity.rb
class AnnotationPostedActivity < NewsfeedActivity
  include GravatarUtils
end

もちろん、Gravatar-ultimateのようなものを使用する方がおそらく簡単です

于 2012-07-12T05:32:47.230 に答える