2011-08-08 69 views
0

我創建的寶石,爲Rails包括JQuery的助手,我希望做這樣的事情在我看來,定義一個方法:如何在寶石

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 

,但不工作,我在做寶石真正的新和可以使用一些幫助

回答

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 

用於定義這些方法不止一個,我會使用由@Travis提到的,而不是前面加上自我所有的方法類< <自我方法。兩者都執行相同的任務。

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

爲了完整,沒有使用類名的定義之前,但使用這使得重構都更困難,因爲你必須改變它在一個以上的地方,如果你重命名你的類的另一種方法。

def HoverImage.mouseoverimage(initimage,hoverimage) 
+0

我愛你對一切的解釋。 –

1

當我在看mini_magick寶石,我注意到他們在合作過class << self de包圍他們的方法,所以我嘗試了attr_accessor之後,我在class << self中包裝了這兩種方法,並且所有事情都按預期工作。

所以,現在的代碼是:

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