コンテキスト:フォーラム用のトリップコード実装(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)を指定し、パスワードが存在する場合にのみ実行します。これが私がこれをやっている理由です。
しかし、これは今ではうまくいかず、私は頭をぶつけて他の問題に移り、何らかのインプットを得ることができればそれに戻ります。私はレールで作業しているので、それは主にレールの問題ではありませんが、そのタグを追加しました。
ねえ、あなたはエラーになり、スタンドアロンのスクリプトを作ることができますか? – solnic