2010-12-02 109 views
1

Le contexte: créer une implémentation de code de voyage (http://en.wikipedia.org/wiki/Tripcode) pour un forum. Essentiellement, un hachage faible pour l'identification sans enregistrement.Datamapper Callback pour le code de trajet Forum

Il existe un modèle, 'Post'. Les messages sont organisés au format parent/enfant, le nouveau poste crée le parent, les réponses créent l'enfant au parent. Il y a un formulaire, en ce moment a un champ qui enregistre sur le contrôleur/modèle, contient un champ de contenu et mot de passe.

require 'bcrypt' 
class Shout 
    include DataMapper::Resource 
    include BCrypt 

    property :id, Serial          # unique key 
    property :content, Text 

    property :password_hash, String 
    property :trip, String         # trip for display  

    belongs_to :forum 
    is :tree, :order => [:created_at] 

    attr_accessor :password 

    #before :save do 

    def password 
    @password ||= Password.new(password_hash) 
    end 

    def password=(new_password) 
    @password = Password.create(new_password) 
    self.password_hash = @password 
    end 

    def trip 
    @trip = '!'<<self.password_hash.to_str[20..33] 
    self.trip = @trip 
    end 

    #end 

end 

DataMapper.finalize 

Le débit de base est ce - après/réponse, s'il y a un mot de passe dans le champ de mot de passe, prendre cela et courir à travers bcrypt, magasin qui password_hash le résultat d'une comparaison ultérieure, créer pour l'affichage Code de voyage. Mais je reçois des erreurs que j'ai battre ma tête contre

L'erreur principale que je reçois est

méthode non définie primitive? pour nul: NilClass

émanant apparemment de

lib/active_support/whiny_nil.rb: 48: dans `method_missing »

Je ne sais pas comment gérer ou de travailler autour de cela. Je ne fais rien ou je vérifie quelque chose avec le contrôleur, mais je ne sais pas encore quoi. L'autre erreur que je reçois provient d'un hachage bcrypt invalide, mais pas capable de le dupliquer immédiatement.

Les méthodes de hook sont directement à partir de la page bcrypt-ruby. Créer un champ BCryptHash fonctionne (dm-types) - mais augmente le temps de traitement du formulaire par un facteur de 10, sur un serveur localhost, et le fait pour chaque poste, donc j'ai besoin d'un moyen de modifier le coût du hachage bcrypt (par exemple, 1 au lieu du défaut 10) et ne le lancez que s'il y a un mot de passe, c'est pourquoi je le fais.

Mais cela ne fonctionne pas pour le moment, je l'ai assez piqué par la tête et je suis passé à d'autres problèmes et j'y suis revenu si je pouvais obtenir des informations. Je travaille avec des rails, donc j'ai ajouté cette étiquette bien que ce ne soit pas principalement un problème de rails.

+0

Hey, pouvez-vous faire un script autonome qui se traduit par l'erreur? – solnic

Répondre