2012-07-19 142 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

相关问题