2011-02-18 123 views
3

我想知道是否有关于自定义操作使用轨验证的方式自定义验证。轨道上行动

例如,我想这样做:

validates_presence_of :description, :on => :publish, :message => "can't be blank" 

我做基本的验证创建和保存,但也有很多事情我不想要求前面。也就是说,他们应该能够保存准确的记录而不验证所有的字段,但是我有我的控制器和模型中的自定义“发布”动作和状态,在使用时应该验证以确保记录是100%

上面的例子没有工作,有什么想法?

UPDATE:

我的状态机看起来是这样的:

include ActiveRecord::Transitions 
    state_machine do 
    state :draft 
    state :active 
    state :offline 

    event :publish do 
     transitions :to => :active, :from => :draft, :on_transition => :do_submit_to_user, :guard => :validates_a_lot? 
    end 

    end 

我发现我可以补充后卫,但我仍然希望能够使用轨验证,而不是做这一切的在自定义方法上。

回答

5

这看起来更像是业务逻辑而不是模型验证了我。我是在一个项目前几年中,我们曾发表文章,以及大量的业务规则,只是在那一刻执行。

我会建议你做类似Model.publish()和方法应该强制所有的业务规则,以便为要发布的项目。

一个选项是运行一个自定义的验证方法,但可能需要一些字段添加到您的模型。这里有一个例子 - 我会假设你模型被称为文章

Class Article < ActiveRecord::Base 
    validate :ready_to_publish 

    def publish 
    self.published = true 
    //and anything else you need to do in order to mark an article as published 
    end 

    private 
    def ready_to_publish 
    if(published?) 
     //checks that all fields are set 
     errors.add(:description, "enter a description") if self.description.blank? 
    end 
    end 
end 

在这个例子中,客户端代码应该调用an_article.publish当被调用article.save它会自动完成剩下的。这种方法的其他的好处是,你的模型将始终是一致的,而不是取决于在其上调用动作。

+0

的变化上这对我有用,但是,我将如何显示我的show view中的错误? – Raoot 2012-09-10 16:51:43

1

如果你的“发布”动作设置某种状态字段的“发布”,那么你可以这样做:

validates_presence_of :description, :if => Proc.new { |a| a.state == 'published' } 

或者,如果每个国家都有自己的方法

validates_presence_of :description, :if => Proc.new { |a| a.published? } 
+0

第二个看起来很有希望,但没有工作。 ;-(我更新了我的问题。 – holden 2011-02-19 09:37:06