2012-07-19 88 views
0

所以我想這樣做,因爲我認爲這是執行錯誤最習慣的方式。製作一個在if語句中評估爲false的對象

例如:

User < ActiveRecord::Base 
    def add_email? 
    ... 
    #in the case that it does have an error 
    MyErrorObjectThatEvaluatesToFalse.new("The email is already taken") 
    end 

    def is_valid_user? 
    ... 
    MyErrorObjectThatEvaluatesToFalse.new("Username is not set") 
    ... 
    end 
end 

... 

SomeController 
    ... 
    if error = user.add_email? 
     render_error_msg(error.message) and return 
    elsif error = user.is_valid_user? 
     render_error_msg(error.message) and return 
    end 
    ... 
end 

我已經嘗試以下解決方案之一,但它並沒有我想的功能:

class A 
    def ==(comp) 
     false 
    end 
    end 

    a = A.new 
    if a 
    puts "'a' evaluated to true" 
    else 
    puts "'a' evaluated to false" 
    end 

    #=> 'a' evaluated to true 

有沒有辦法做到像這樣或有其他人找到了一種方法來處理錯誤,比當前的rails方式間接獲取user.valid的組合信息更好?和user.errors?

謝謝!

+0

這不是慣用的,爲什麼不在控制器中設置N個模型驗證+一個'record.save'或'record.update_attributes'?控制器必須簡單。 – tokland 2012-07-19 19:42:11

回答

0

我不會推薦作爲驗證的方法,但是定義一個類,它返回一個比較錯誤:

class A 
    def ==(comp) 
    false 
    end 
end 

A.new == "a" #false 
A.new == true #false 
A.new == false #false 
A.new == nil #false 

我會建議使用Rails的built in validations

class User < ActiveRecord::Base 
    validates :username, :presence => true 
end 

user = User.new 
user.errors #["username must not be blank"] 
+0

感謝您的建議,這裏有一大堆我在ActiveRecord之外做的事情(理想情況是它應該全部集成在其中,但現在不應該...) 另外我嘗試了以上操作,但是具體的下面的功能似乎不起作用: https://gist.github.com/160e1db7b3724c71b541 – 2012-07-19 23:01:44

+0

是的,這是行不通的,因爲你沒有比較任何東西。 'a'仍然返回對象A,否則你不能再引用該對象。你必須明確地指向'a == anything' – Gazler 2012-07-20 06:33:57

+0

是的,有沒有什麼辦法可以實現這個功能,即模擬false或nil?我知道對於他們兩個來說,他們只有一個實例,我不能創建更多的FalseClass或NilClass實例,即使我將它們子類化了......而實例eval對它們也不起作用,所以我可以不要給他們添加信息,即使這種信息有效,這可能會產生奇怪的後果,因爲他們只有一次。也許這只是走錯了路線,但... – 2012-07-20 16:29:38