2012-03-17 66 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 
相關問題