【发布时间】:2012-03-04 23:05:07
【问题描述】:
有人可以举一个简单的例子来说明如何将pluginaweek state_machine 用于具有活动记录的票证模型吗? 我不理解文档中的复杂示例。
示例状态:
- 新 -> 接受、拒绝、反馈
- 接受 -> 已解决或反馈
- 反馈 -> 接受或解决
【问题讨论】:
标签: ruby-on-rails activerecord state-machine
有人可以举一个简单的例子来说明如何将pluginaweek state_machine 用于具有活动记录的票证模型吗? 我不理解文档中的复杂示例。
示例状态:
【问题讨论】:
标签: ruby-on-rails activerecord state-machine
票证模型示例(未测试)
class Ticket < ActiveRecord::Base
attr_accessible :name, :description
attr_accessible :state_event
validates :name, :presence => true
state_machine :initial => :new do
event :accept do
transition [:new, :feedback] => :accepted
end
event :decline do
transition :new => :declined
end
event :feedback do
transition [:new, :accepted] => :feedbacked
end
event :solve do
transition [:accepted, :feedback] => :solved
end
end
end
获取表单中所有可能的转换
<%= f.collection_select :state_event, @ticket.state_transitions, :event, :human_to_name, :include_blank => @ticket.human_state_name %>
获取工单状态:<%= ticket.state %>
以链接形式获取所有可能的工单转换:
<% ticket.state_transitions.each do |transition| %>
<%= link_to transition.event, ticket_path(ticket, ticket: {:state_event => transition.event}), :method => :put %>
<% end %>
列出所有可能的转换以在控制器中过滤
<ul>
<li class="<%= 'active' if params[:state].blank? %>"><%= link_to 'All', tickets_path %></li>
<% Ticket.state_machine.states.each do |state| %>
<li class="<%= 'active' if params[:state] == state.name.to_s %>">
<%= link_to state.name, tickets_path(:state => state.name) %>
</li>
<% end %>
</ul>
class TicketsController extends ApplicationController
...
def index
@tickets = Ticket.where("state = ?", params[:state])
...
【讨论】: