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.自己实现方法

这很容易。并且已经有 ruby​​ 代码可以遵循。你可能需要AnnotationPostedActivity在你的模型中包含一些 Rails 的助手

>> 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/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 回答