Bonjour,
je rencontre depuis quelques jours une erreur assez incompréhensible
lors du rendu d’un template.
Je dis incompréhensible car elle se reproduit de façon erratique.
J’ai un modèle Body qui possède dans sa table plusieurs champs pouvant
nommer un body :
name, preliminary_designation, iau_id
Et je définis une méthode designation qui me renvoie le premier
attribut non-nul.
Voilà le code simplifié (j’ai supprimé les méthodes de validation)
class Body < ActiveRecord::Base
has_many :bodies_encounters
has_many :encounters, :through => :bodies_encounters
def designation
possible_designations = [‘name’, ‘preliminary_designation’,
‘iau_id’]
possible_designations.each { |d|
return self.attributes[d] unless self.attributes[d].blank?
}
# ne devrait pas arriver grâce aux validations
return nil
end
end
La méthode marche très bien lorsque je l’applique à un Body. Et si je
liste (dans le template index)
tous les Bodies et que j’applique la méthode à tous, ça fonctionne
encore très bien.
Mais lorsque je liste les Encounters liés à ces Bodies, c’est là que
ça coince de façon aléatoire :
ActionView::TemplateError (NaN) on line #29 of app/views/encounters/
_table.html.erb:
26:
27:
td>
28:
29: <%= link_to b1.designation, b1 %>
30:
31: <% if b1.class.to_s.eql?(‘Tno’) %>
end %>
32:
/usr/pkg/lib/ruby/1.8/date.rb:422:in `floor'
/usr/pkg/lib/ruby/1.8/date.rb:422:in `jd_to_civil'
/usr/pkg/lib/ruby/1.8/date.rb:1066:in `__18057__'
(eval):4:in `civil'
/usr/pkg/lib/ruby/1.8/date.rb:1081:in `year'
app/models/body.rb:40:in `designation'
app/models/body.rb:39:in `each'
app/models/body.rb:39:in `designation'
app/views/encounters/_table.html.erb:29
app/views/encounters/_table.html.erb:21:in `each'
app/views/encounters/_table.html.erb:21
app/views/encounters/index.html.erb:3
app/controllers/encounters_controller.rb:11:in `index'
Les Encounters sont très nombreux (+ de 7000), et le rendu plante
parfois dès le début, parfois
plutôtvers la fin (je le vois aux “select bodies.* …” qui sont fait dans
la base)
Par contre, quand je change ma méthode en :
def designation
return self.name unless self.name.blank?
return self.preliminary_designation unless
self.preliminary_designation.blank?
return self.iau_id unless self.iau_id.blank?
return nil
end
là, je n’ai plus aucun plantage.
Je dois avouer que l’erreur concernant la date me laisse perplexe, car
il n’est question de
date nulle part. J’ai bien un attribut de type date dans la table
Body, mais elle n’est
pas en jeu ici.
Est-ce que l’un d’entre-vous aurait déjà rencontré une telle erreur ?
Merci d’avance