我的模型有一个名为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
时验证是否正确。
建议将不胜感激。
答案 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?
的快捷方式。当与布尔属性一起使用时,它表明开发人员的意图是检查是否为真。