Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
aad5a30b
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
aad5a30b
编写于
8月 04, 2009
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add simple support for ActiveModel's StateMachine for ActiveRecord
上级
55d1d12c
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
122 addition
and
29 deletion
+122
-29
activemodel/lib/active_model/state_machine.rb
activemodel/lib/active_model/state_machine.rb
+2
-5
activemodel/lib/active_model/state_machine/event.rb
activemodel/lib/active_model/state_machine/event.rb
+5
-7
activemodel/lib/active_model/state_machine/machine.rb
activemodel/lib/active_model/state_machine/machine.rb
+13
-16
activemodel/lib/active_model/state_machine/state_transition.rb
...emodel/lib/active_model/state_machine/state_transition.rb
+1
-1
activerecord/lib/active_record.rb
activerecord/lib/active_record.rb
+1
-0
activerecord/lib/active_record/state_machine.rb
activerecord/lib/active_record/state_machine.rb
+24
-0
activerecord/test/cases/state_machine_test.rb
activerecord/test/cases/state_machine_test.rb
+42
-0
activerecord/test/models/traffic_light.rb
activerecord/test/models/traffic_light.rb
+27
-0
activerecord/test/schema/schema.rb
activerecord/test/schema/schema.rb
+7
-0
未找到文件。
activemodel/lib/active_model/state_machine.rb
浏览文件 @
aad5a30b
...
...
@@ -5,12 +5,9 @@ module StateMachine
autoload
:State
,
'active_model/state_machine/state'
autoload
:StateTransition
,
'active_model/state_machine/state_transition'
class
InvalidTransition
<
Exception
end
extend
ActiveSupport
::
Concern
def
self
.
included
(
base
)
require
'active_model/state_machine/machine'
base
.
extend
ClassMethods
class
InvalidTransition
<
Exception
end
module
ClassMethods
...
...
activemodel/lib/active_model/state_machine/event.rb
浏览文件 @
aad5a30b
require
'active_model/state_machine/state_transition'
module
ActiveModel
module
StateMachine
class
Event
...
...
@@ -53,12 +51,12 @@ def update(options = {}, &block)
self
end
private
def
transitions
(
trans_opts
)
Array
(
trans_opts
[
:from
]).
each
do
|
s
|
@transitions
<<
StateTransition
.
new
(
trans_opts
.
merge
({
:from
=>
s
.
to_sym
}))
private
def
transitions
(
trans_opts
)
Array
(
trans_opts
[
:from
]).
each
do
|
s
|
@transitions
<<
StateTransition
.
new
(
trans_opts
.
merge
({
:from
=>
s
.
to_sym
}))
end
end
end
end
end
end
activemodel/lib/active_model/state_machine/machine.rb
浏览文件 @
aad5a30b
require
'active_model/state_machine/state'
require
'active_model/state_machine/event'
module
ActiveModel
module
StateMachine
class
Machine
...
...
@@ -57,22 +54,22 @@ def current_state_variable
"@
#{
@name
}
_current_state"
end
private
def
state
(
name
,
options
=
{})
@states
<<
(
state_index
[
name
]
||=
State
.
new
(
name
,
:machine
=>
self
)).
update
(
options
)
end
private
def
state
(
name
,
options
=
{})
@states
<<
(
state_index
[
name
]
||=
State
.
new
(
name
,
:machine
=>
self
)).
update
(
options
)
end
def
event
(
name
,
options
=
{},
&
block
)
(
@events
[
name
]
||=
Event
.
new
(
self
,
name
)).
update
(
options
,
&
block
)
end
def
event
(
name
,
options
=
{},
&
block
)
(
@events
[
name
]
||=
Event
.
new
(
self
,
name
)).
update
(
options
,
&
block
)
end
def
event_fired_callback
@event_fired_callback
||=
(
@name
==
:default
?
''
:
"
#{
@name
}
_"
)
+
'event_fired'
end
def
event_fired_callback
@event_fired_callback
||=
(
@name
==
:default
?
''
:
"
#{
@name
}
_"
)
+
'event_fired'
end
def
event_failed_callback
@event_failed_callback
||=
(
@name
==
:default
?
''
:
"
#{
@name
}
_"
)
+
'event_failed'
end
def
event_failed_callback
@event_failed_callback
||=
(
@name
==
:default
?
''
:
"
#{
@name
}
_"
)
+
'event_failed'
end
end
end
end
activemodel/lib/active_model/state_machine/state_transition.rb
浏览文件 @
aad5a30b
...
...
@@ -18,7 +18,7 @@ def perform(obj)
true
end
end
def
execute
(
obj
,
*
args
)
case
@on_transition
when
Symbol
,
String
...
...
activerecord/lib/active_record.rb
浏览文件 @
aad5a30b
...
...
@@ -65,6 +65,7 @@ def self.load_all!
autoload
:SchemaDumper
,
'active_record/schema_dumper'
autoload
:Serialization
,
'active_record/serialization'
autoload
:SessionStore
,
'active_record/session_store'
autoload
:StateMachine
,
'active_record/state_machine'
autoload
:TestCase
,
'active_record/test_case'
autoload
:Timestamp
,
'active_record/timestamp'
autoload
:Transactions
,
'active_record/transactions'
...
...
activerecord/lib/active_record/state_machine.rb
0 → 100644
浏览文件 @
aad5a30b
module
ActiveRecord
module
StateMachine
#:nodoc:
extend
ActiveSupport
::
Concern
include
ActiveModel
::
StateMachine
included
do
before_validation
:set_initial_state
validates_presence_of
:state
end
protected
def
write_state
(
state_machine
,
state
)
update_attributes!
:state
=>
state
.
to_s
end
def
read_state
(
state_machine
)
self
.
state
.
to_sym
end
def
set_initial_state
self
.
state
||=
self
.
class
.
state_machine
.
initial_state
.
to_s
end
end
end
activerecord/test/cases/state_machine_test.rb
0 → 100644
浏览文件 @
aad5a30b
require
'cases/helper'
require
'models/traffic_light'
class
StateMachineTest
<
ActiveRecord
::
TestCase
def
setup
@light
=
TrafficLight
.
create!
end
test
"states initial state"
do
assert
@light
.
off?
assert_equal
:off
,
@light
.
current_state
end
test
"transition to a valid state"
do
@light
.
reset
assert
@light
.
red?
assert_equal
:red
,
@light
.
current_state
@light
.
green_on
assert
@light
.
green?
assert_equal
:green
,
@light
.
current_state
end
test
"transition does not persist state"
do
@light
.
reset
assert_equal
:red
,
@light
.
current_state
@light
.
reload
assert_equal
"off"
,
@light
.
state
end
test
"transition does persists state"
do
@light
.
reset!
assert_equal
:red
,
@light
.
current_state
@light
.
reload
assert_equal
"red"
,
@light
.
state
end
test
"transition to an invalid state"
do
assert_raise
(
ActiveModel
::
StateMachine
::
InvalidTransition
)
{
@light
.
yellow_on
}
assert_equal
:off
,
@light
.
current_state
end
end
activerecord/test/models/traffic_light.rb
0 → 100644
浏览文件 @
aad5a30b
class
TrafficLight
<
ActiveRecord
::
Base
include
ActiveRecord
::
StateMachine
state_machine
do
state
:off
state
:red
state
:green
state
:yellow
event
:red_on
do
transitions
:to
=>
:red
,
:from
=>
[
:yellow
]
end
event
:green_on
do
transitions
:to
=>
:green
,
:from
=>
[
:red
]
end
event
:yellow_on
do
transitions
:to
=>
:yellow
,
:from
=>
[
:green
]
end
event
:reset
do
transitions
:to
=>
:red
,
:from
=>
[
:off
]
end
end
end
activerecord/test/schema/schema.rb
浏览文件 @
aad5a30b
...
...
@@ -448,6 +448,13 @@ def create_table(*args, &block)
t
.
integer
:pet_id
,
:integer
end
create_table
:traffic_lights
,
:force
=>
true
do
|
t
|
t
.
string
:location
t
.
string
:state
t
.
datetime
:created_at
t
.
datetime
:updated_at
end
create_table
:treasures
,
:force
=>
true
do
|
t
|
t
.
column
:name
,
:string
t
.
column
:looter_id
,
:integer
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录