コンテキスト: フォーラムの tripcode 実装 (http://en.wikipedia.org/wiki/Tripcode) を作成します。基本的に、登録不要の識別のための弱いハッシュ。
「Post」というモデルが 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
基本的なフローは次のとおりです。投稿/返信。パスワード フィールドにパスワードがある場合は、それを取得して bcrypt を実行し、後で比較するためにその結果を password_hash として保存し、表示用のトリップコードを作成します。しかし、頭を打ち負かしてきたエラーが発生しています
私が得ている主なエラーは
未定義のメソッド「プリミティブ?」nil:NilClass の場合
から発しているように見える
lib/active_support/whiny_nil.rb:48:`method_missing' 内
これを処理または回避する方法がわかりません。私は何かをしていないか、コントローラーで何かをチェックしていませんが、まだわかりません。私が得ている他のエラーは、無効な bcrypt ハッシュに起因しますが、これをすぐに複製することはできません。
フック メソッドは、bcrypt-ruby ページのすぐそばにあります。
BCryptHash フィールドの作成 (dm-types) は機能しますが、ローカルホスト サーバーでフォームを処理する時間が 10 倍になり、投稿ごとに処理されるため、bcrypt ハッシュのコストを微調整する方法が必要です。 (たとえば、デフォルトの10ではなく1)、パスワードが存在する場合にのみ実行します。これが、私がこれを行っている理由です。
しかし、これは今のところうまくいきません。私は十分に頭をぶつけて、他の問題に移り、何らかの意見が得られたら戻ってきます。私はレールで作業しているので、主にレールの問題ではありませんが、そのタグを追加しました。