2012-03-17 95 views
1

我有这个模型的更新值无法保存在DataMapper的模型

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,但它没有被保存。我假设这是非常简单的事情,但我似乎无法弄清楚。任何人都知道为什么赋值为true的@ user.validated没有被保存?

谢谢。

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

当我告诉DataMapper的提高对故障

User.raise_on_save_failure = true 

我收到此错误

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

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

+0

不知道这是否适用于dm,但是会触发save方法并查看是否会抛出错误:@ user.save! – three 2012-03-17 11:42:37

+0

不,datamapper实际上遵循'@ user.save!'的ruby约定是危险的方法。试试'@ user.save_or_raise'。 – Reactormonk 2012-03-17 14:56:33

+0

它似乎在datamapper中设置User.raise_on_save_failure = true。我确实得到这个错误#。不知道该从哪里出发,但它确认我至少要保存它。 :) – wuliwong 2012-03-17 19:30:06

回答

2

你们没有办法从我提供的信息中弄清楚这一点。 :)问题是我产生的字符串:validation_code实际上太长了。一旦我把验证码截断到合适的大小(我认为少于50个字符),一切正常。

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

2

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

property :validation_code, String, :length => 500