TimGoulain / tim_app

ruby on rails tutorial
0 stars 0 forks source link

Associate fa-image to sector #20

Closed TimGoulain closed 9 years ago

TimGoulain commented 9 years ago

Bon, j'ai quelques soucis avec mon helper... Il ressemble à cela :

module OffersHelper
  def sector_image
    if @offer.sector.code = "Hotel"
      fa.fa-bed
    end
  end
end

Et ça me donne : undefined method `sector' for nil:NilClass J'avoue ne pas comprendre le message d'erreur... J'ai aucun secteur dont la valeur est nil (je crois) Qu'en penses-tu ?

jibai31 commented 9 years ago

En fait la plupart des helpers prennent l'objet principal en argument (pas vraiment une convention mais c'est comme ça en pratique).

Si tu as un ProjectsHelper avec un méthode project_owner, ça va donner :

module ProjectsHelper
  def project_owner(project)
    project.user.name
  end
end

Et il s'appelle comme ça (par exemple dans un div avec la classe author, en supposant que tu as bien la variable @project) :

.author= project_owner(@project)

Donc dans ton cas, quelques trucs à changer :

  1. Ajouter l'offer en argument de la méthode.
  2. Attention dans le if, c'est un double-égal pour vérifier l'égalité (sinon tu assignes la valeur "Hotel" à l'attribut offer.sector.code)
  3. Tu es en Ruby dans le helper, fa.fa-bed va forcément causer une erreur (tu appelles la méthode fa-bed sur l'objet faqui n'existe bien-sûr pas). Il va te falloir les quotes "fa.fa-bed".

Petit point aussi sur ton analyse de l'erreur. Il ne connait pas la méthode sector sur l'objet nul. En gros il te dit qu'il a exécuté nil.sector. En regardant la ligne, tu vois que @offerest nul.

Ca donnerait quelque chose comme ça :

module OffersHelper
  def sector_image(offer)
    if offer.sector.code == "Hotel"
      'fa.fa-bed'
    elsif offer.sector.code == "Restaurant"
      'fa.fa-blablabla'
    end
  end
end

Légère amélioration, tu stockes la variable offer.sector.code histoire d'être un peu plus DRY.

module OffersHelper
  def sector_image(offer)
    sector_code = offer.sector.code
    if sector_code == "Hotel"
      'fa.fa-bed'
    elsif sector_code == "Restaurant"
      'fa.fa-blablabla'
    end
  end
end

Ou bien tu utilises un case.

Et pour l'appeler, ça va te faire un truc de ce style :

.offer
  .sector-img
    %b{class: sector_image(@offer)}
  ...
jibai31 commented 9 years ago

En regardant ça en fait ton helper devrait uniquement renvoyer 'fa-bed', puisque l'image aura la classe fa dans tous les cas.

Et le haml donnera :

%b.fa{class: sector_image(@offer)}