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 不喜欢我正在做的事情。我知道 datamapper 不喜欢“脏”记录,但我不认为这里是这种情况,对吧?

4

2 回答 2

2

你们不可能从我提供的信息中弄清楚这一点。:) 问题是我为 :validation_code 生成的字符串实际上太长了。一旦我将验证代码切成合适的大小(我认为少于 50 个字符?),一切都会正常工作。

这对我来说是另一个教训,不要偷工减料,一次添加一个东西。叹....

于 2012-03-17T20:15:03.693 回答
2

根据 DataMapper 的文档,字符串的默认长度是 50 个字符。只需在属性声明中使用正确的值:

    property :validation_code, String, :length => 500
于 2014-02-10T12:36:26.617 回答