2010-11-28 4 views
1

Essayer de régler la date created_at manuellement:ensemble propriété created_at Manuel [Rails 3]

entry = Entry.new 
entry.text = tweet['text'] 
entry.source = 'tweet' 
entry.user_id = user.id 
entry.latitude = coords[1] 
entry.longitude = coords[0] 
entry.created_at = Chromium(tweet.created_at) 

Obtenir l'erreur suivante:

undefined method `created_at' for #<Hash:0x1036af910> 

Comment puis-je éviter cela? Je souhaite conserver la fonctionnalité par défaut de created_at car toutes les entrées ne sont pas saisies de cette manière.

Répondre

3

Votre problème ne réside pas dans la méthode created_at de l'objet ActiveRecord. Je pense que ce qui crache l'erreur ici est en fait la méthode created_at appelée sur votre objet tweet.

Voir ci-dessus - vous utilisez

entry.text = tweet['text'] 

(tweet est un hachage) ... mais

entry.created_at = Chromium(tweet.created_at) 

se plaint que le Hash ne dispose pas d'une méthode appelée created_at

undefined method `created_at' for #<Hash:0x1036af910> 
3

Le problème ici est qu'il n'y a pas une méthode created_at sur le tweet objet, qui est un hachage. Vous avez probablement voulu dire

entry.created_at = Chromium(tweet['created_at']) 

Cependant, lorsqu'un objet est enregistré pour la première fois, Rails remplace l'attribut created_at. C'est un comportement assez fixe et vous ne serez pas en mesure de le contourner sans déranger quelque chose d'autre.

Mieux vaut créer une nouvelle colonne datetime, par exemple tweeted_at et l'utiliser.

+1

Merci! Vous aviez tous les deux raison, mais j'ai d'abord vu mylescarricks. Merci :) –

+0

Juste remarqué votre commentaire à propos de ne pas pouvoir le remplacer. J'ai différents types d'entrée, certains tirés de sources externes via cron/rake et d'autres entrés via l'interface utilisateur des rails, ce qui pourrait être le cas avec la date ajoutée. Devrais-je simplement appeler le champ autre chose afin d'éviter l'automagique, ou avoir un importé qui est utilisé sinon du web? –

+0

Oui, mieux vaut éviter le nom 'created_at'. Même si vous pouvez faire en sorte que Rails cesse de faire ce qu'il veut faire, beaucoup d'autres plugins peuvent s'attendre à ce qu'un champ 'created_at' fasse ce qu'il fait habituellement. Mieux vaut être en sécurité qu'ennuyé – Gareth