Может кто-нибудь привести пример активной записи для pluginaweek - statemachine? - PullRequest
4 голосов
/ 05 марта 2012

Может ли кто-нибудь привести простой пример использования pluginaweek state_machine для модели заявки с активной записью? Я не понимаю сложные примеры из документов.

Пример состояния:

  • новое -> принято, отклонено, обратная связь
  • принято -> решено или обратная связь
  • обратная связь -> принято или решено

1 Ответ

6 голосов
/ 05 марта 2012

Пример модели билета (не тестировался)

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])
    ...       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...