在if语句中创建一个求值为false的对象

时间:2012-07-19 19:32:32

标签: ruby-on-rails ruby if-statement

所以我想这样做,因为我认为这是最常用的做错误的方式。

例如:

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

有没有办法做这样的事情,或者有其他一些方法来处理错误,这比当前使用user.valid组合间接获取消息的rails方式更好?和user.errors?

谢谢!

1 个答案:

答案 0 :(得分:0)

我不建议将其作为验证方法,但要定义一个在比较器上返回false的类:

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"]