TimGoulain / tim_app

ruby on rails tutorial
0 stars 0 forks source link

Problème en prod pour créer des offres d'emploi #25

Open TimGoulain opened 8 years ago

TimGoulain commented 8 years ago

Jibai, help ! Le site plante lorsque je veux poster une offre d'emploi (offers). Voilà l'erreur :

Completed 500 Internal Server Error in 623ms
2015-12-27T06:37:21.368999+00:00 app[web.1]:
2015-12-27T06:37:21.369002+00:00 app[web.1]: ActionView::Template::Error (undefined method `code' for nil:NilClass):
2015-12-27T06:37:21.369002+00:00 app[web.1]:     2:   .col-md-8
2015-12-27T06:37:21.369003+00:00 app[web.1]:     3:     .well.core
2015-12-27T06:37:21.369004+00:00 app[web.1]:     4:       .label.label-info
2015-12-27T06:37:21.369005+00:00 app[web.1]:     5:         %b.fa{class: offer_image(offer)}
2015-12-27T06:37:21.369005+00:00 app[web.1]:     6:         = offer.code
2015-12-27T06:37:21.369006+00:00 app[web.1]:     7:       .information
2015-12-27T06:37:21.369007+00:00 app[web.1]:     8:         %h5
2015-12-27T06:37:21.369008+00:00 app[web.1]:   app/helpers/offers_helper.rb:3:in `offer_image'
2015-12-27T06:37:21.369009+00:00 app[web.1]:   app/views/offers/_offer.html.haml:5:in `_app_views_offers__offer_html_haml___3556184458390749515_70196186479900'
2015-12-27T06:37:21.369009+00:00 app[web.1]:   app/views/offers/index.html.haml:18:in `_app_views_offers_index_html_haml___575360389731705350_70196186180620'
2015-12-27T06:37:21.369010+00:00 app[web.1]:
2015-12-27T06:37:21.369011+00:00 app[web.1]:

L'offre devrait s'afficher avec les informations que j'ai remplies, dont notamment le secteur. Chaque secteur a un code, et c'est ce code qui lie le secteur à l'offre. Dans ma view, j'ai : ... = offer.code et dans le model offer.rb:

delegate :code, to: :sector, prefix: false, allow_nil: true

En allant dans la console heroku, j'ai vu que mon offre n'avait pas de sector_id, ce qui expliquait le plantage ; mais même après lui en avoir attribué un, l'erreur reste la même. Ce que je ne comprends pas, c'est cette réponse de la console :

 from /app/bin/rails:8:in `<main>'irb(main):003:0> o = Offer.find(1)
=> #<Offer id: 1, position: "General Labourer", employer_id: 6, started_at: "2016-01-04", ended_at: "2016-02-01", sector_id: nil, created_by_id: 1, created_at: "2015-12-27 05:44:13", updated_at: "2015-12-27 05:44:13", description: "">
irb(main):004:0> o.sector_id = "1"
=> "1"
irb(main):005:0> o.save
=> true
irb(main):006:0> o = Offer.find(1)
=> #<Offer id: 1, position: "General Labourer", employer_id: 6, started_at: "2016-01-04", ended_at: "2016-02-01", sector_id: 1, created_by_id: 1, created_at: "2015-12-27 05:44:13", updated_at: "2015-12-27 06:37:11", description: "">
irb(main):007:0> s = Sector.find(1)
ActiveRecord::RecordNotFound: Couldn't find Sector with 'id'=1

Bon, je viens de vérifier en local en tapant cela, et il se trouve que l'id 1 n'existe pas ; du coup j'ai réessayé avec l'id 2, qui elle existe en local, mais ça ne marche toujours pas :

ActiveRecord::RecordNotFound: Couldn't find Sector with 'id'=2

Je me demande en fait si je ne dois pas recréer mes secteurs à la main, en me mettant admin en prod et en les rentrant comme ça.

As-tu une autre idée à première vue?

J'ai réglé un des autres problèmes, pour ajouter une expérience de job au profil, ça marche maintenant mais j'ai des doutes sur la stabilité du truc (le date-picker est bizarre et ne marche qu'une fois sur deux, en local comme en prod...)

jibai31 commented 8 years ago

Pour l'erreur dans la vue sur le offer.code, c'est offer qui est nulle, pas son secteur. Vérifie où est définie offer. A priori tu as déclaré @offers dans le controler offers, méthode index. Ensuite dans le template index.html.haml tu dois faire un render @offers, normalement, ce qui appellerait bien le partial _offer.html.haml en lui passant chaque offer, mais si t'en a un qui est nul c'est qu'il y a un souci quelque part. Donc vérifie déjà ça.

jibai31 commented 8 years ago

Pour les associations, il vaut mieux éviter d'attribuer des ids. Si possible, ne fais pas ça :

o.sector_id = 1   # par ailleurs, sans les quotes, les ids sont des integers, pas des strings

Mais fais plutôt ça :

s = Sector.find(1) # ou s = Sector.first
o.sector = s

Ca t'évite de créer une association invalide s'il n'y a pas de secteur avec l'id 1.