`
Hisea
  • 浏览: 1102 次
  • 性别: Icon_minigender_1
  • 来自: 加拿大
最近访客 更多访客>>
社区版块
存档分类
最新评论

Rails中用AASM实现工作流与多步骤向导

阅读更多
ruby有一个act as state machine的插件,可以实现工作流或者多步骤向导的功能。
state machine,是计算机科学里面一种模型,这个插件主要实现的是finite state machine,既有限状态自动机。

首先,AASM的安装:
config.gem "rubyist-aasm", :source => "http://gems.github.com", :lib => 'aasm'


安装好之后需要在你的Model里面加入
include AASM


下面是一个简单的例子。来介绍AASM的使用。
加入我们有一个person的model,一个person可以处于三种状态,sleeping, working 还有eating.
初始状态是sleeping,
从sleeping只可以通过eat事件,转到eating,不可以转到working.(吃了饭才能工作)。
从working只可以通过eat事件,转到eating,不可以转到sleeping. (不能空肚子睡觉)。
然后从eating可以通过work事件转到working,或者sleep转到sleeping.

这些可以转化成下面的代码
class Person < ActiveRecord::Base
  include AASM
 
  aasm_column :current_state # 定义那个字段来储存当前状态
  aasm_initial_state :sleeping #定义初始状态
 
  #定义三个不同的状态
  aasm_state :sleeping
  aasm_state :eating
  aasm_state :working

  #定义每个event及event发生时引发的状态转换
  aasm_event :eat do
    transitions :from => [:sleeping,:working], :to => :eating
  end
 
  aasm_event :work do
    transitions :from => :eating, :to =>:working
  end
 
  aasm_event :sleep do
    transitions :from => :eating, :to => :sleeping
  end
end

这样基本上就已经建好了state machine了。可以在console里面实验一下:
ruby-1.8.7-p249 > p=Person.create
 => #<Person id: 10, name: nil, current_state: "sleeping", created_at: "2010-05-09 06:32:41", updated_at: "2010-05-09 06:32:41">
ruby-1.8.7-p249 > p.aasm_events_for_current_state
 => [:eat]
ruby-1.8.7-p249 > p.eat
 => true
ruby-1.8.7-p249 > p
 => #<Person id: 10, name: nil, current_state: "eating", created_at: "2010-05-09 06:32:41", updated_at: "2010-05-09 06:32:41">
ruby-1.8.7-p249 > p.aasm_events_for_current_state
 => [:sleep, :work]
ruby-1.8.7-p249 > p.work
 => true
ruby-1.8.7-p249 > p
 => #<Person id: 10, name: nil, current_state: "working", created_at: "2010-05-09 06:32:41", updated_at: "2010-05-09 06:32:41">
ruby-1.8.7-p249 > p.aasm_current_state
 => :working


可以看到,可以直接用 p.event的形式,来触发事件。
aasm_current_state来获得当前状态,aasm_events_for_current_state 来获得当前状态可用的event.

结合到view的时候也很简单。把aasm_events_for_current_state获得的集合交给用户选择。
返回到server之后的param经过验证之后。可以用p.send(param[:event])的形式触发。

这里的例子是一个工作流的例子。多步骤向导也很类似,这里不再赘述。

除此之外,AASM还提供了很多有用的callback, 感兴趣的朋友可以深入研究一下。
github列出了下面几个:
oldstate:exit*
event:before
__find transition, if possible__
transition:on_transition*
oldstate:before_exit
newstate:before_enter
newstate:enter*
__update state__
event:success*
oldstate:after_exit
newstate:after_enter
event:after
obj:aasm_event_fired*
分享到:
评论

相关推荐

    rails向导打包

    Rails 向导是 Ruby on Rails 开发者的重要资源,它为初学者和经验丰富的开发者提供了深入理解 Rails 框架的全面指南。本压缩包包含了多个关键主题的详细文档,涵盖了从数据库操作到应用调试等多个方面。让我们逐一...

    Ruby-一个Rails引擎提供工作流程的基本基础设施

    在本案例中,"Ruby-一个Rails引擎提供工作流程的基本基础设施"指的是一个专门为实现工作流程管理而设计的Rails引擎。 工作流程(Workflow)通常涉及到业务流程的自动化,包括任务分配、状态转换和审批流程等。...

    Struts2和Rails的国际化实现

    Struts2和Rails都是流行的Web开发框架,它们都提供了强大的功能来支持应用程序的国际化,使得开发者可以轻松地为不同语言的用户提供本地化体验。这里我们将深入探讨这两个框架的国际化实现。 **Struts2的国际化实现...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    Ruby on Rails安装指南(Ruby 1.8.6+Rails 2.0.2)

    随着互联网的快速发展,Ruby on Rails作为一种流行的Web开发框架,在开发领域得到了广泛的应用。它的简易性与高效性让许多开发者为之...随着实践经验的积累,相信你能够更加熟练地运用Ruby on Rails来实现创新的项目。

    关于rails 3.1 cucumber-rails 1.2.0

    这些步骤的实现位于`step_definitions`目录下,通常包含Ruby代码,它们将Gherkin步骤与实际的代码逻辑关联起来。通过这种方式,Cucumber-Rails帮助团队确保代码按照预期运行,同时提供了一种非技术人员也能理解的...

    rails magazine issue 3

    **知识点:** Chee Yeo 解释了如何使用 AASM(Active State Machine)来实现在 Ruby on Rails 应用中的复杂工作流逻辑。AASM 提供了一种声明式的方法来定义对象的状态及其转换,使得业务逻辑的管理变得更加直观和...

    rails2-sample

    这一章节将介绍如何在Rails应用中集成Ajax技术,实现更加交互式的用户体验。同时,还将探讨Web 2.0的概念,包括社会化网络、用户生成内容和实时数据流等。 #### 8. Protective Measures(防护措施) 网络安全是...

    Rails101_by_rails4.0

    作者特别提到了“CRUD懶人大法Scaffold”,它是一种通过Rails自动生成代码的方式来快速搭建基本的CRUD操作,这大大简化了开发流程,使得开发者可以将更多的精力放在业务逻辑的实现上。 此外,书中还介绍了一些Rails...

    Rails

    压缩包子文件的文件名称 "Ruby on Rails.pptx" 提示可能是一个关于Rails的PowerPoint演示文稿,其中可能涵盖了Rails的基础概念、安装步骤、主要组件介绍、开发流程、最佳实践,以及可能的示例代码和案例研究。...

    中文版rails教程

    ActiveRecord是Rails的ORM系统,它将数据库表与Ruby类绑定,通过ActiveRecord对象操作数据。 2. **视图(View)**:视图负责呈现用户界面,通常由HTML、CSS和JavaScript组成。Rails的 erb(嵌入式Ruby)模板允许...

    Rails项目源代码

    在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个图片。 5. **路由配置**: Rails的路由系统将URL映射到控制器的行动上,如`/...

    rails实现验证码实例

    标题中的“rails实现验证码实例”指的是使用Ruby on Rails框架创建一个验证码功能的示例。Rails是基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,常用于构建数据库驱动的Web应用。...

    ruby on rails与MySql的环境配置——支持rails 2.3.5以上版本

    总之,配置Ruby on Rails与MySQL环境虽然需要一些步骤,但只要按照指南一步步操作,大部分开发者都能成功完成。记得在配置过程中遇到困难不要灰心,多尝试、多搜索,一定能够找到解决方案。通过这样的实践,你将对...

    rails3.1安装与mysql配置 windows

    标题 "rails3.1安装与mysql配置 windows" 涉及到的是在Windows操作系统上安装Ruby on Rails 3.1框架并配置MySQL数据库的过程。这是一个关键的开发环境设置步骤,对于使用Rails进行Web开发的程序员来说至关重要。Ruby...

    Rails 101S

    ### Rails 101S: 初学者必备的Ruby on Rails 宝典 #### Introduction: 深入了解Ruby on Rails 《Rails 101S》是一本为Ruby on Rails初学者准备的手册,旨在帮助新手快速入门并掌握基本的开发技能。本手册将从最...

    RailsSpace

    本章将详细介绍Ajax的工作原理及其在Rails中的具体应用。 #### 六、后续发展 ##### 6.1 未来发展方向 第十七章“What next?”展望了RailsSpace项目的发展方向,提出了可能的改进方案和扩展功能,鼓励读者根据自己...

    Rails 中mongrel的安装

    2. **Ruby编写**: 作为纯Ruby实现的服务器,Mongrel与Rails框架集成紧密,减少了中间层带来的额外复杂性。 3. **轻量级**: Mongrel体积小巧,启动快速,适合开发和测试环境。 ** 安装Mongrel ** 在Rails项目中安装...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...

Global site tag (gtag.js) - Google Analytics