无法将更新保存到datamapper模型中的值

时间:2012-03-17 09:10:32

标签: sinatra boolean models datamapper updating

我有这个模型

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赋值?

感谢。

------更新----------

当我告诉datamapper在失败时加注

User.raise_on_save_failure = true

我收到此错误

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

我知道它并不多,但我知道我正在尝试保存,而datamapper并不喜欢我正在做的事情。我知道datamapper不喜欢“脏”记录,但我不认为这是这样的,对吗?

2 个答案:

答案 0 :(得分:2)

你们没有办法从我提供的信息中弄明白这一点。 :)问题是我生成的字符串:validation_code实际上太长了。一旦我将验证码剁到正确的大小(我认为少于50个字符?),一切正常。

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

答案 1 :(得分:2)

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

    property :validation_code, String, :length => 500