2010-12-02 9 views
1

コンテキスト:フォーラム用のトリップコード実装(http://en.wikipedia.org/wiki/Tripcode)の作成。本質的に、登録のない識別のための弱いハッシュ。Datamapperフォーラムトリップコードのコールバック

「投稿」というモデルが1つあります。投稿は親/子の形式で配置され、新しい投稿は親を作成し、返信は子を親に作成します。 1つのフォームがあり、今すぐコントローラ/モデルに投稿するフィールドがあり、コンテンツとパスワードフィールドが含まれています。

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 

基本的な流れはこれです - パスワード]フィールドにパスワードがある場合は、ポスト/返信、表示のためにtripcodeを作成し、それを取り、後で比較するためにpassword_hashとして結果bcryptの、ストアを介して実行します。しかし、私は、私は

に対して私の頭を叩いてきたエラーを取得しています、私は取得しています主なエラーが

未定義のメソッド `プリミティブで?」 nilのために:48:NilClass

は一見

のlib/active_support/whiny_nil.rbから発せられる `method_missing」

に私が扱うか、この問題を回避する方法がわかりません。私は何かをやっていないか、コントローラーで何かをチェックしているわけではありませんが、何がわからないのですか?私が得ている他のエラーは、無効なbcryptハッシュに由来しますが、すぐにこれを複製することはできません。

フックメソッドは、bcrypt-rubyページのすぐ外にあります。

BCryptHashフィールドを作成すると、(dm-types)が動作しますが、フォームをローカルホストサーバーで10倍処理する時間が増え、すべてのポストで実行されるため、コストを調整する必要がありますbcryptハッシュ(たとえば、デフォルトの10ではなく1)を指定し、パスワードが存在する場合にのみ実行します。これが私がこれをやっている理由です。

しかし、これは今ではうまくいかず、私は頭をぶつけて他の問題に移り、何らかのインプットを得ることができればそれに戻ります。私はレールで作業しているので、それは主にレールの問題ではありませんが、そのタグを追加しました。

+0

ねえ、あなたはエラーになり、スタンドアロンのスクリプトを作ることができますか? – solnic

答えて