我有这个模型
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不喜欢“脏”记录,但我不认为这是这样的,对吗?
答案 0 :(得分:2)
你们没有办法从我提供的信息中弄明白这一点。 :)问题是我生成的字符串:validation_code实际上太长了。一旦我将验证码剁到正确的大小(我认为少于50个字符?),一切正常。
这对我来说是另一个教训,即不要偷工减料,一次添加一件东西。叹息....
答案 1 :(得分:2)
根据DataMapper的文档字符串的默认长度是50个字符。只需在属性声明中使用正确的值:
property :validation_code, String, :length => 500