如何在Gem中定义方法

时间:2011-08-08 14:12:22

标签: ruby-on-rails ruby-on-rails-3

我正在为包含JQuery助手的Rails创建一个Gem,我希望在我看来做这样的事情:

 JQueryCheats::HoverImage.mouseoverimage("image1.jpg","image2.jpg")

我有以下几点设置:

 module JQueryCheats
class HoverImage
#class used to do a quick Hover image
attr_accessor :image_tag
def initialize()

end

def mouseoverimage(initimage,hoverimage)
   @image_tag =""
   @image_tag = "<img src=\"#{initimage}\" alt=\"image\" onmouseover=\"$(this).attr('src','#{hoverimage}')\" onmouseout=\"$(this).attr('src','#{initimage}')\">"
   return @image_tag
 end

 end
end

但这不起作用,我真的很擅长制作宝石并可以使用一些帮助

2 个答案:

答案 0 :(得分:3)

听起来像是想要class method

您可以使用self关键字执行此操作。

module JQueryCheats
 class HoverImage
    attr_accessor :image_tag
    def initialize()

    end

    def self.mouseoverimage(initimage,hoverimage) #Note the self
      @image_tag =""
      @image_tag = "<img src=\"#{initimage}\" alt=\"image\" onmouseover=\"$(this).attr('src','#{hoverimage}')\" onmouseout=\"$(this).attr('src','#{initimage}')\">"
      return @image_tag
    end

  end
end

为了定义多个这些方法,我会使用 class&lt;&lt; @Travis提到的自我方法,而不是将self置于所有方法之前。两者都执行相同的任务。

class << self
  def mouseoverimage(initimage, hoverimage)
  end
end

为了完整性,在定义之前还有另一种使用类名的方法,但是使用它会使重构更加困难,因为如果重命名类,必须在多个位置更改它。

def HoverImage.mouseoverimage(initimage,hoverimage)

答案 1 :(得分:1)

当我查看mini_magick gem时,我注意到他们的代码中包含了class << self并且在方法中包含了class << self,所以我在attr_accessor之后尝试了,我将这两个方法包装在module JQueryCheats class HoverImage #class used to do a quick Hover image attr_accessor :image_tag class << self def mouseoverimage(initimage,hoverimage) @image_tag ="" @image_tag = "<img src=\"#{initimage}\" alt=\"image\" onmouseover=\"$(this).attr('src','#{hoverimage}')\" onmouseout=\"$(this).attr('src','#{initimage}')\">" return @image_tag.html_safe end def initialize() end end#end self end end 中,一切都工作为预期

现在代码是:

{{1}}