2010-07-08 5 views
1

Gallery has_many photos. Photos belongs_to galerieMéthode non définie pour nil: NilClass dans une vue d'association

Dans ma photo « show » vue je reçois l'erreur « méthode non définie name » pour nul: NilClass' pour la ligne

<%= @photo.gallery.name %> 

l'erreur apparaît uniquement sur les photos qui ne sont pas une partie d'une galerie (qui n'a pas de nom de galerie qui lui est assigné) celles qui le font, apparaissent comme prévu, c'est-à-dire que le nom de la galerie est indiqué. L'API dit "Ruby déclenche NoMethodError si vous invoquez une méthode sur un objet qui n'y répond pas" mais l'objet photo ne doit pas répondre à gallery.name même s'il est vide ?? comme les modèles sont correctement associés ...

Répondre

4

Vous ne le réalisez peut-être pas, mais vous faites un chaînage de méthodes.

@photo.gallery renvoie l'objet Gallery associé à la photo. @photo.gallery.name renvoie le nom associé à l'objet Gallery associé à la photo.

est peut-être plus facile de penser à cela comme (@photo.gallery).name

Ce qui suit est équivalent à votre code:

<% @gallery = @photo.gallery %> 
<%= @gallery.name %> 

Dans votre cas, quand une photo a pas de galerie, retours @ photo.gallery de zéro. Vous avez simplement besoin de vérifier cela:

<%= @photo.gallery.name unless @photo.gallery.nil? %> 

Ou ayez un autre cas pour quand il n'existe pas, ce que vous voulez.

+0

merci, est la méthode chaining mauvais? parce que ça a l'air confus? –

+0

Pas du tout, c'est très utile. Rappelez-vous que Ruby évalue de gauche à droite, par exemple '" 123 ".to_i.to_s.size' convertira" 123 "d'abord en Integer, puis en retour en String, puis retournera la taille de la chaîne (qui est 3). Vous avez juste besoin d'être prudent lors du chaînage des méthodes lorsque la valeur de retour de la méthode peut être nulle. – Karl

0

Il serait préférable de définir dans le modèle photo si la galerie est obligatoire pour la photo.

validate_presence_of :gallery_id 

Ensuite, ce problème ne se produirait pas.

Questions connexes