1

コンテキスト: フォーラムの 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)、パスワードが存在する場合にのみ実行します。これが、私がこれを行っている理由です。

しかし、これは今のところうまくいきません。私は十分に頭をぶつけて、他の問題に移り、何らかの意見が得られたら戻ってきます。私はレールで作業しているので、主にレールの問題ではありませんが、そのタグを追加しました。

4

1 に答える 1

0

Feel free to review or contribute or use for errors here.

https://github.com/blueblank/Shout/tree/oneshout

于 2010-12-03T18:11:41.643 に答える