5

Tôi đang tìm một plugin máy trạng thái tương đối đơn giản cho dự án Rails 3/Active Record.Bạn muốn giới thiệu plugin State Machine nào cho Rails?

tôi đã thực hiện một nghiên cứu nhỏ và đưa ra các plugin sau:

Nhưng tất cả dường như rất giống nhau, vì vậy tôi tò mò muốn biết nếu có ai ghé thăm gian thực trải nghiệm thế giới với bất kỳ ai trong số họ.

Cảm ơn!

+0

Nếu nó giúp nhận được ý tưởng về mức độ phổ biến tương đối của chúng, bạn có thể xem tại đây: https://www.ruby-toolbox.com/categories/state_machines –

+0

Nhận xét: Chúng tôi đã tạo [một video ngắn] (http: //www.platform45.com/videos/show/10) giải thích luồng trạng thái có thể hữu ích. – Neil

Trả lời

12

state_machine dường như là một trong những người nói để sử dụng, ít nhất là những người tôi đã nói chuyện với. Đó là môi trường bất khả tri, vì vậy bạn không phải sử dụng một máy trạng thái trong một phần của ứng dụng của bạn và một máy tính hoàn toàn khác trong một phần khác của ứng dụng của bạn.

Cập nhật tháng 2 năm 2015

máy nhà nước là tiếc là không còn được duy trì và có nhiều vấn đề, mà làm cho nó một sự lựa chọn kém thuận lợi. Tuy nhiên, this fork của dự án được duy trì tích cực và có vẻ ổn định.

4

Tôi đã kết thúc bằng cách sử dụng luồng trạng thái và thích nó. https://github.com/ryanza/stateflow

Nó chạy với đường ray 3.0 và nó tương tự như cách tiếp cận với mã máy nhà nước nằm trong một số bản beta 3.0 của rails nhưng bị loại khỏi bản phát hành cuối cùng. Tôi đã không theo dõi để xem suy nghĩ hiện tại về việc có một máy trạng thái bên trong đường ray là gì - nhưng tôi đoán rằng nếu một máy trạng thái được tích hợp lại trong một bản phát hành trong tương lai, nó sẽ hơi giống thế này. Hy vọng rằng điều đó sẽ có nghĩa là thay đổi mã tối thiểu nếu tôi muốn bỏ đá quý và sử dụng chức năng cốt lõi

+0

Tôi đã không nghe nói về điều này - Tôi thực sự thích cú pháp. Tôi vừa thêm nó vào danh sách trên. –

+0

Luồng trạng thái có lợi ích của quá trình chuyển đổi động (nơi bạn có thể có một số logic nghiệp vụ xác định trạng thái tiếp theo), trong trường hợp đó là điều bạn cần. – crishoj

3

Tôi sẽ tiếp cận Chuyển tiếp cẩn thận. Tác giả/vắt nói rằng ông không có thời gian để duy trì nó, và thường ủng hộ state_machine về các dự án mới của mình.

Mặt khác, nó hoạt động (mặc dù kiểm tra các vấn đề mở để xem nó có hoạt động trong trường hợp của bạn hay không). Tôi đang sử dụng chuyển tiếp bản thân mình trên một dự án, nhưng đối với một máy nhà nước tầm thường.

Tôi đã sử dụng hoạt động như máy nhà nước trước đây, trên một dự án Rails 2, và nó đã làm rất tốt (ngay cả với các máy trạng thái rất phức tạp)

0

Ngay cả những viên ngọc máy nhà nước đơn giản nhất có tính năng cách hơn tôi cần , vì vậy tôi quyết định cuộn giải pháp của riêng mình.Tôi đã thử chuyển đổi và Stateflow, nhưng có vấn đề nhỏ với cả hai.

+0

Thật thú vị khi biết những gì bạn đã chọn, nhưng tôi không chắc rằng điều này đủ điều kiện làm câu trả lời. Tại sao không chỉ làm cho nó cập nhật cho câu hỏi của bạn? – iconoclast

+0

Điểm tốt. Tôi sẽ để nó như là một câu trả lời, nhưng bỏ đánh dấu nó là câu trả lời "the" vì nó thực sự là một câu hỏi mở. –

+0

Để thực sự đủ điều kiện làm câu trả lời, bạn có nghĩ rằng bạn nên chia sẻ mã bạn đã sử dụng không? Nếu không, phần Hỏi & đáp này có dạng "Tôi nên làm gì X?" "Tôi đã làm theo cách của riêng tôi". – iconoclast

2

SimpleStateMachine là một DSL đơn giản để trang trí các phương pháp hiện có với các nhân viên bảo vệ chuyển tiếp trạng thái.

class LampSwitch 
    extend SimpleStateMachine 

    def initialize 
    self.state = 'off' 
    end 

    event :push_switch, :off => :on 
end 

lamp = LampSwitch.new 
lamp.state   # => 'off' 
lamp.off?   # => true 
lamp.push_switch # 
lamp.state   # => 'on' 
lamp.on?   # => true 

Nó hoạt động với kiểm chứng thực ActiveModel và cho phép các sự kiện để được gọi với đối số:

class User < ActiveRecord::Base 
    ... 
    def activate_account(activation_code) 
    if activation_code_invalid?(activation_code) 
     errors.add(:activation_code, 'Invalid') 
    end 
    end 
    event :activate_account, :invited => :activated 
end 

user = User.new 
user.activate_account!('INVALID') # => raises ActiveRecord::RecordInvalid 
user.activated?      # => false 
user.activate_account!('VALID') 
user.activated?      # => true 

Nó có thể cứu ngoại lệ:

def download_data 
    raise Service::ConnectionError 
end 
event :download_data, Service::ConnectionError => :download_failed 

user.download_data    # catches Service::ConnectionError 
user.state      # => "download_failed" 
user.state_machine.raised_error # the raised error 
0

Tôi muốn giới thiệu Workflow như tôi cảm thấy nó dễ của tất cả các máy trạng thái có sẵn.

Các vấn đề liên quan