2010-01-07 11 views
5

के साथ रेल त्रुटियों का संचालन मैं अपने इवेंट ऑब्जेक्ट (ईवेंट प्रारंभ, घटना चर्चा, घटना प्रकाशित, आदि) में विभिन्न राज्यों को संभालने के लिए 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 

उत्तर

0

मुझे रूबीस्ट-एस्सम 2.0.2 में पता है आप 'कॉल' जोड़ सकते हैं संक्रमण विधि कॉल करने के लिए जो संक्रमण विफल होने पर झूठी वापसी करेगा। तो मान लें कि आपके पास नामक नियंत्रक विधि है:

def approve 
    @event = Event.find params[:id] 

    if @event.approve! 
    # transition occurred 
    else 
    # handle the failed transition (flash or errors) 
    end 
end 

मुझे बताएं कि आप क्या सोचते हैं?

+0

धन्यवाद, यह नियंत्रक में काम करेगा लेकिन मैं इन चीजों को मॉडल में रखना चाहता हूं। आपके समाधान के साथ मैं अभी भी सत्यापन के बिना किसी अन्य मॉडल में संक्रमण का उपयोग कर सकता हूं। – Cimm

+1

आह, ठीक है। आईएमओ गार्ड वास्तव में एक सत्यापन त्रुटि नहीं है जहां तक ​​एआर मॉडल का संबंध है, यह एक गार्ड है जो बस राज्य मशीन पर होने वाली संक्रमण की रक्षा करता है, मैं व्यक्तिगत रूप से कॉल करने से खुश हूं! विधि (किसी अन्य मॉडल या नियंत्रक में) और वापसी की जांच। यदि आप सही नहीं पूछते हैं तो आप कुछ नहीं देख सकते हैं? मैं यहां पूरी तरह गलत हो सकता हूं इसलिए मुझे यह देखने में खुशी होगी कि क्या कोई अन्य समाधान फसल हो रहा है। यदि आप वास्तव में एक सत्यापन त्रुटि भी चाहते हैं तो आप validates_presence_of जैसे कुछ जोड़ सकते हैं: मूल्य,: if => "self.second_state?" – tsdbrown

2

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 
संबंधित मुद्दे