This works beautifully! The workitem is created from a POST to the
create action and then almost instantaneously PrivatePub is sending
the js to the browser and updating the view. This makes for a very
smooth user experience when the views are updated with jQuery's fadeIn
and fadeOut. It feels like a traditional web app and the user never
has to know things are happening asynchronously. This will make multi-
step forms much easier to code and more RESTful.

John, thanks again for your help and I'm becoming a bigger fan of
Ruote every day!

On Feb 21, 3:23 pm, John Mettraux <[email protected]> wrote:
> On Tue, Feb 21, 2012 at 08:45:38AM -0800, Reed Law wrote:
>
> > I am exploring using Ryan Bates' private_pub gem to allow the server
> > to send messages to clients about new workitems. The way I imagine it
> > working is that Ruote would send a message when a new workitem appears
> > to the user's browser which would then display the appropriate
> > template that allows the user to process that workitem.
>
> > (...)
>
> > But I'm not sure how to implement this. When a user creates a new
> > paper, a workflow is launched in the controller. That workflow is then
> > run asynchronously while the controller sends its response
> > synchronously to the user. When the asynchronous ruote process
> > presents a workitem to the user participant, how can I get it to
> > launch--e.g. PrivatePub.publish_to "/messages/new", :workitem_message
> > => "New task available." I don't want the workitem to be processed at
> > this point, just passed to the user for processing.
>
> Hello Reed,
>
> I don't think you need to implement the whole participant by yourself.
>
> This should be sufficient:
>
> ---8<---
> class ReedParticipant < Ruote::StorageParticipant
>
>   def on_workitem
>     super
>     PrivatePub.publish_to(
>       '/messages/new', :workitem_message => 'New task available.')
>   end
> end
> --->8---
>
> It's the regular storage participant, it receives the workitem, stores in the
> storage and then notifies the user thanks to PrivatePub.
>
> In config/initializers/ruote-kit.rb you have to bind the participant names to
> that participant:
>
> ---8<---
> RuoteKit.engine.register do
>
>   participant 'user_.*', ReedParticipant
>     # all participant whose name start with 'user_' are notified
>
>   catchall Ruote::StorageParticipant
>     # no notifications for the rest
> end
> --->8---
>
> > Let me try to guess how a custom participant would work:
>
> OK, let's walk through those methods together.
>
> > The #on_workitem method would call PrivatePub#publish_to with the
> > user's session id and new task.
>
> Yes, but in the ReedParticipant above we also store the workitem (thanks to
> the Ruote::StorageParticipant parent class).
>
> > #on_cancel would cancel the workitem, perhaps after a certain amount
> > of time had passed.
>
> #on_cancel is called when the flow the participant is in gets cancelled.
> There are roughly three types of cancellation: deliberate cancellation (of
> a workflow or of a part of it), timeout cancellation and rollback
> cancellation (trigerred by an error handler).
>
> > #on_reply would define what to do with the processed workitem before
> > continuing.
>
> Yes, it gives you an opportunity to tweak the workitem right before the
> participant hands it back to the engine.
>
> > Then I would need to implement a receiver that would be called by the
> > controller when the user submits the processed workitem. How would
> > this receiver respond to the correct workitem? I assume that would be
> > defined by #workitem_from_msg in the example
> >http://ruote.rubyforge.org/implementing_participants.html#on_reply
>
> Yes, exactly. But as we've seen above, you don't seem to need a receiver at
> all, you are merely adding a bell to the Ruote::StorageParticipant.
>
> I hope it all makes sense, best regards,
>
> --
> John Mettraux -http://lambda.io/processi

-- 
you received this message because you are subscribed to the "ruote users" group.
to post : send email to [email protected]
to unsubscribe : send email to [email protected]
more options : http://groups.google.com/group/openwferu-users?hl=en

Reply via email to