rails 3根据布尔值验证状态

时间:2012-07-17 19:04:27

标签: ruby-on-rails-3 if-statement model validation

我的模型有一个名为draft

的布尔值

我想仅在draft == false时验证字段的存在。

我的模特

if self.draft == false
  validates :name, :presence => true, :length => { :maximum => 45 }
  validates :description, :presence => true
  validates :blurb, :presence => true, :length => { :maximum => 175 }
  validates :category_id, :presence => true
  validates :location_id, :presence => true
  validates :goal, :presence => true
else
end

在我的控制器中

def new
  @item.new(:draft => false) || @item.new(:draft => true)

def create
  if params[:commit] == "Create Item"
    @cause = Item.new(params[:item], :draft => false)
  elsif params[:commit] == "Save Changes"
    @cause = Item.new(params[:item], :draft => true)
  end

完全忽略我的if语句,并在点击Save Changes时验证是否正确。

建议将不胜感激。

2 个答案:

答案 0 :(得分:8)

条件验证如下所示

validates :name, :presence => true, :length => { :maximum => 45 }, :if => :draft_is_false?

private
def draft_is_false?
   draft == false
end

同样,您可以对其他字段执行条件验证,也可以对这些字段进行分组。浏览Ruby on Rails指南中的Conditional Validations部分。

答案 1 :(得分:0)

以下是较新的rails语法中的一个内容:

validates :name, presence: true, length: { maximum: 45 }, if: -> (item) { item.draft? } 

请注意草稿属性后面有一个问号。 Rails为模型上的所有属性自动创建draft?等方法,基本上是attr.present?的快捷方式。当与布尔属性一起使用时,它表明开发人员的意图是检查是否为真。