Ficou mais claro quando vi o código da classe Order.
No cliente:
class Order < ActiveRecord::Base
uses_restfulie
end
No server:
[code]class Order < ActiveRecord::Base
acts_as_restfulie do |order, transitions|
transitions << :execute_it if (order.status == “preparing”) && order.paid_one_minute_ago?
transitions << [:thanks, { :action => :thanks }] if order.status == "received"
end
has_and_belongs_to_many :trainings
has_many :payments
state :unpaid, :allow => [:latest, :pay, :cancel]
state :cancelled, :allow => :latest
state :received, :allow => [:latest, :check_payment_info]
state :preparing, :allow => [:latest, :check_payment_info]
state :ready, :allow => [:latest, :receive, :check_payment_info]# do |order|
order.paid_one_minute_ago?
end
transition :check_payment_info do |order|
{:controller => :payments, :action => :show, :order_id => order.id, :payment_id => order.payments[0].id, :rel => "check_payment_info"}
end
transition :latest, {:action => :show}, {:not_found => 404, :no_change => 304}
transition :cancel, {:action => :destroy}, :cancelled
# 405 ==> (dont do it)
# 409 ==> (try again)
# order.status==“cancelled”… trying to cancel ==> 405
# order.status==“preparing”… trying to update it ==> 409
# order.status==“unpaid”… invalid data supplied ==> 400?
transition :pay, {}, :preparing
transition :receive, {}, :received
transition :execute_it, {}, :ready
def paid_one_minute_ago?
# takes one minute to be prepared
self.paid_at < (Time.now - 1.minute)
end
def pay(payment)
debugger
move_to :pay
self.paid_at = Time.now
@payment = payment
@payment.order = self
end
def total_price
total = 0
@trainings.each do |x|
total += x.price
end
total
end
def paid?
payments.size > 0
end
# def can_cancel?
# raise 405 if @status == :cancelled
# # ...
# end
end[/code]
Essa classe stub no cliente ainda não me parece uma boa ideia… Acredito que existe uma forma melhor mas ainda não sei como…
Vou ver como ficaria isso em Java. Vi um exemplo onde o NetBeans gera a classe JavaScript stub a partir de uma serviço REST. Acho isso muito SOAP!!! Onde está o desacoplamento se preciso gerar o cliente caso alguma mudança seja feita no server?