我正在尝试从我的一个模型中调用 gravatar_for。(是的,我意识到这不是严格意义上的 MVC,但我有正当理由这样做,但我不打算这样做)。我正在尝试将 Gravatar 的助手包括在内,但我没有成功找到它们是什么。
到目前为止,像这样将它包含在我的课堂上是行不通的:
class AnnotationPostedActivity < NewsfeedActivity
include GravatarHelper::PublicMethods
我正在尝试从我的一个模型中调用 gravatar_for。(是的,我意识到这不是严格意义上的 MVC,但我有正当理由这样做,但我不打算这样做)。我正在尝试将 Gravatar 的助手包括在内,但我没有成功找到它们是什么。
到目前为止,像这样将它包含在我的课堂上是行不通的:
class AnnotationPostedActivity < NewsfeedActivity
include GravatarHelper::PublicMethods
假设您使用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&size=50\" />
# (not what we want at all)
你看,你必须提供user
对象作为gravatar_for
方法的第一个参数。所以你要做的是
一个提供一个查看self.email
而不是要求它作为方法参数的模块。
这很容易。并且已经有 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"
如果这是您尝试混入模型的辅助模块,那么这是一个信号,表明需要稍微移动一下。助手是真正的视图助手,只能从视图中调用。如果那里有对模型本身也有用的逻辑,则将其移至库中。例如:
# 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