【问题标题】:Rails error handling with AASM state machine使用 AASM 状态机处理 Rails 错误
【发布时间】:2010-01-07 08:27:54
【问题描述】:

我正在使用rubyist-aasm 状态机来处理我的事件对象中的不同状态(事件初始化、事件讨论、事件发布等)。我添加了守卫以防止在不满足某些条件时更改状态。

这一切都很好,但是当守卫拒绝状态更改时,它不会显示任何错误。知道我怎么能看到状态没有改变吗?我可以手动检查状态,但这听起来像一个丑陋的解决方案。

aasm_state :firststate 
aasm_state :secondstate  

aasm_event :approve do
  transitions :to => :secondstate, :from => [:firststate], :guard => :has_a_price? 
end

def has_a_price?   
  self.price.present?
end

【问题讨论】:

    标签: ruby-on-rails state state-machine aasm


    【解决方案1】:

    使用SimpleStateMachine,您可以通过添加错误来保护状态转换:

    def approve
      errors.add(:price, 'Invalid') if price.blank?
    end
    event :approve, :firststate => :secondstate
    

    虽然在这种情况下,当前的价格与事件无关,所以这样做就足够了:

    validates_presence_of :price, :if => "self.second_state?"
    event :approve, :firststate => :secondstate
    

    【讨论】:

      【解决方案2】:

      我知道在 ruby​​ist-aasm 2.0.2 中你可以调用 add '!'到转换方法调用,如果转换失败,它将返回 false。因此,假设您有一个名为approve 的控制器方法:

      def approve
        @event = Event.find params[:id]
      
        if @event.approve!
          # transition occurred
        else
          # handle the failed transition (flash or errors)
        end
      end
      

      让我知道你的想法?

      【讨论】:

      • 谢谢,这可以在控制器中使用,但我想将这些东西保留在模型中。使用您的解决方案,我仍然可以在另一个模型中使用转换而无需通过验证。
      • 啊,好的。不过,就 AR 模型而言,IMO 守卫并不是真正的验证错误,它只是保护状态机上不会发生转换的守卫,我个人很乐意调用 !方法(在另一个模型或控制器中)并检查返回。如果你不问,你就不能“看到”一些东西,对吧?我在这里可能完全错了,所以我很乐意看看是否有其他解决方案出现。如果你真的想要一个验证错误,你可以添加类似 validates_presence_of :price, :if => "self.second_state?"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多