2010-09-14 7 views
3

Dans mes rails actuels (Rails 2.3.5, Ruby 1.8.7) application, si je voudrais être en mesure de définir une aide comme:Paramètres optionnels pour Rails image Aide

def product_image_tag(product, size=nil) 
    html = '' 
    pi = product.product_images.first.filename 
    pi = "products/#{pi}" 
    pa = product.product_images.first.alt_text 

    if pi.nil? || pi.empty? 
     html = image_tag("http://placehold.it/200x200", :size => "200x200") 
    else 
     html = image_tag(pi, size) 
    end 

    html 

    end 

... et puis l'appeler d'une vue soit:

<%= product_image_tag(p) %> 

... ou:

<%= product_image_tag(p, :size => 20x20) %> 

en d'autres termes, je voudrais être en mesure d'avoir cette méthode d'assistance prendre une option paramètre de taille. Quel serait le meilleur moyen d'y parvenir?

Répondre

10

Vous êtes sur la bonne voie. Je ferais ceci:

def product_image_tag(product, options = {}) 
    options[:size] ||= "200x200" 

    if img = product.product_images.first 
    image_tag("products/#{img.filename}", :alt => img.alt_text, :size => options[:size]) 
    else 
    image_tag("http://placehold.it/#{options[:size]}", :size => options[:size]) 
    end 
end 

Explications:

Réglage du paramètre final à un hachage vide est un langage Ruby commun, puisque vous pouvez appeler une méthode comme product_image_tag(product, :a => '1', :b => '2', :c => '3', ...) sans faire explicitement les arguments restant un hachage avec {} .

options[:size] ||= "200x200" définit le paramètre: size à 200x200 si un paramètre n'a pas été transmis à la méthode.

if img = product.product_images.first - Ruby vous permet d'effectuer des affectations à l'intérieur d'une condition, ce qui est impressionnant. Dans ce cas, si product.product_images.first renvoie zéro (aucune image), vous revenez à votre lien placehold.it, sinon affichez la première image.

+0

Parfait! Merci beaucoup. – yalestar

Questions connexes