我试图从我的一个模型中调用gravatar_for。 (是的,我意识到这不是严格意义上的MVC,但我有合理的理由这样做,我不会进入)。我正在尝试为Gravatar包含助手,但我还没有成功找到它们。
到目前为止,将它包括在我的班级里面,所以不起作用:
class AnnotationPostedActivity < NewsfeedActivity
include GravatarHelper::PublicMethods
答案 0 :(得分: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&size=50\" />
# (not what we want at all)
你知道,你必须提供user
对象作为gravatar_for
方法的第一个参数。所以你需要做的是
提供查看self.email
而不是将其作为方法参数的模块。
It's easy。并且already ruby code可以跟随。你可能需要在你的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"
答案 1 :(得分: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
这样的东西可能更容易