1

私はこのモデルを持っています

class User
  include DataMapper::Resource
  include BCrypt

  property :id, Serial
  property :email, String, :required => true
  property :password_hash, Text, :required => false
  property :user_name, String, :required => true
  property :birthdate, Date
  property :city, String
  property :state, String
  property :zip, String
  property :bio, Text
  property :validated, Boolean, :default => false
  property :validation_code, String
  property :created_at, DateTime
  property :updated_at, DateTime
end

私はこのルートを持っています

get '/validate/:code/:user_id/?' do
  @user = User.get params[:user_id]

  if @user.validation_code == params[:code]
    @user.validated = true
    @user.save
  end

  erb :validate
end

@user.validated は true に設定されていますが、保存されていません。これは非常に単純なことだと思いますが、理解できないようです。@user.validated への true の割り当てが保存されない理由を知っている人はいますか?

ありがとう。

- - - アップデート - - - - -

データマッパーに失敗時に発生するように指示すると

User.raise_on_save_failure = true

このエラーが表示されます

#<DataMapper::SaveFailureError: User#save returned false, User was not saved>

大したことではないことはわかっていますが、保存しようとしていて、データマッパーが私がしていることを気に入らないことはわかっています。datamapper が「汚い」レコードを好まないことは知っていますが、ここではそうではないと思いますよね?

4

2 に答える 2

2

DataMapper のドキュメントによると、文字列のデフォルトの長さは 50 文字です。プロパティ宣言で正しい値を使用するだけです:

    property :validation_code, String, :length => 500
于 2014-02-10T12:36:26.617 に答える
2

私が提供した情報から、皆さんがこれを理解できる方法はありませんでした。:) 問題は、:validation_code 用に生成していた文字列が実際には長すぎることでした。検証コードを適切なサイズ (50 文字未満だと思いますか?) に切り詰めると、すべてが正常に機能します。

これは、手を抜いて一度に 1 つずつ追加するのではなく、私にとってもう 1 つの教訓です。はぁ....

于 2012-03-17T20:15:03.693 に答える