Your SlideShare is downloading. ×
Integrating Flex And Rails With Ruby Amf
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Integrating Flex And Rails With Ruby Amf

4,794
views

Published on

Published in: Technology

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,794
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
85
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Flex and Rails Tony Hillerson Software Architect with RubyAMF EffectiveUI RailsConf
  • 2. Code and Slides: http://github.com/thillerson/preso_code/
  • 3. Sample du Jour: Stuff
  • 4. Why Flex and Rails? They Make The Great Tag Team!
  • 5. [SKIP INTRO]
  • 6. What are the Options?
  • 7. XML
  • 8. XML is the Default Option
  • 9. # POST /contexts # POST /contexts.xml def create @context = Context.new(params[:context]) respond_to do |format| if @context.save flash[:notice] = 'Context was successfully created.' format.html { redirect_to(@context) } format.xml { render :xml => @context, :status => :created, :location => @context } else format.html { render :action => quot;newquot; } format.xml { render :xml => @context.errors, :status => :unprocessable_entity } end end end
  • 10. JSON Javascript Object Notation
  • 11. JSON is in Rails Too format.json { render :json => @context.to_json } http://as3corlib.googlecode.com var obj:Object = JSON.decode(jsonString)
  • 12. AMF Action Message Format
  • 13. AMF is the Good Stuff Buck Thinks it’s Great!
  • 14. RubyAMF http://rubyamf.org http://rubyamf.googlecode.com
  • 15. Installing RubyAMF $ script/plugin install http://rubyamf.googlecode.com/svn/current/rubyamf • New File: app/controllers/rubyamf_controller.rb • New File: config/rubyamf_config.rb • config/initializers/mime_types.rb modified: Mime::Type.register quot;application/x-amfquot;, :amf • config/routes.rb modified: ActionController::Routing::Routes.draw do |map| map.rubyamf_gateway 'rubyamf_gateway', :controller => 'rubyamf', :action => 'gateway' end
  • 16. Con guring RubyAMF module RubyAMF module Configuration ClassMappings.translate_case = true ClassMappings.assume_types = false ParameterMappings.scaffolding = true ClassMappings.register( :actionscript => 'Task', :ruby => 'Task', :type => 'active_record', #:associations => [quot;contextquot;], :attributes => [quot;idquot;, quot;labelquot;, quot;context_idquot;, quot;completed_atquot;, quot;created_atquot;, quot;updated_atquot;]) end end
  • 17. Con guring RubyAMF ClassMappings.translate_case = false public var created_at:Date; ClassMappings.translate_case = true public var createdAt:Date; // created_at in rails
  • 18. Con guring RubyAMF ClassMappings.assume_types = true class Context < ActiveRecord::Base matches [RemoteClass(alias=quot;Contextquot;)] public class Context { for free
  • 19. Con guring RubyAMF ClassMappings.assume_types = false class Context < ActiveRecord::Base matches [RemoteClass(alias=quot;Contextquot;)] public class Context { with registration ClassMappings.register( :actionscript => 'Context', :ruby => 'Context', :type => 'active_record', :attributes => [quot;idquot;, ...])
  • 20. Con guring RubyAMF ParameterMappings.scaffolding = false def save becomes save(context); @context = params[0] ParameterMappings.scaffolding = true def save save( @context = becomes {context:context} params[:context] );
  • 21. Connecting to Rails via RubyAMF <mx:RemoteObject id=quot;contextsServicequot; destination=quot;rubyamfquot; endpoint=quot;http://localhost:3000/rubyamf_gateway/quot; source=quot;ContextsControllerquot; showBusyCursor=quot;truequot; /> public function save(context:Context):void { var call:AsyncToken = contextsService.save({context:context}); call.addResponder(responder); }
  • 22. Development Work ow
  • 23. 1. Generate and Migrate $ script/generate rubyamf_scaffold context label:string class CreateContexts < ActiveRecord::Migration def self.up create_table :contexts do |t| t.string :label t.timestamps end end def self.down drop_table :contexts end end $ rake db:migrate
  • 24. def load_all @contexts = Context.find :all respond_to do |format| format.amf { render :amf => @contexts } end end def save respond_to do |format| format.amf do if params[:context].save render :amf => params[:context] else render :amf => FaultObject.new(params[:context].errors.join(quot;nquot;)) end end end end
  • 25. 2. Sample Data work: id: 1 label: Work home: id: 2 label: Home anarco_syndicalist_commune_biweekly_meetings: id: 3 label: Anarcho-syndicalist Commune Bi-weekly Meetings
  • 26. 3. Test class Context < ActiveRecord::Base validates_presence_of :label class ContextTest < ActiveSupport::TestCase def test_context_without_label_fails non_label_context = Context.new assert !(non_label_context.save) error_messages = non_label_context.errors.on(:label) assert !(error_messages.empty?) end
  • 27. 4. Con gure ClassMappings.register( :actionscript => 'Context', :ruby => 'Context', :type => 'active_record', #:associations => [quot;tasksquot;], :attributes => [quot;idquot;, quot;labelquot;, quot;created_atquot;, quot;updated_atquot;])
  • 28. 5. Wire <mx:RemoteObject id=quot;contextsServicequot; destination=quot;rubyamfquot; endpoint=quot;http://localhost:3000/rubyamf_gateway/quot; source=quot;ContextsControllerquot; showBusyCursor=quot;truequot; /> <mx:RemoteObject id=quot;tasksServicequot; destination=quot;rubyamfquot; endpoint=quot;http://localhost:3000/rubyamf_gateway/quot; source=quot;TasksControllerquot; showBusyCursor=quot;truequot; />
  • 29. 5. Wire public function loadAll():void { var call:AsyncToken = service.load_all(); call.addResponder(responder); } public function save(context:Context):void { var call:AsyncToken = service.save({context:context}); call.addResponder(responder); } public function destroy(context:Context):void { var call:AsyncToken = service.destroy({id:context.id}); call.addResponder(responder); }
  • 30. 5. Wire public function execute(event:CairngormEvent):void { var evt:SaveContextEvent = event as SaveContextEvent; var delegate:ContextsDelegate = new ContextsDelegate(this); delegate.save(evt.context); } public function result(data:Object):void { var result:ResultEvent = data as ResultEvent; var context:Context = result.result as Context; ... }
  • 31. X. Rinse and Repeat
  • 32. The Future
  • 33. Gem Plugin + Gem C Extension
  • 34. Gem Plugin C Extension
  • 35. An Impassioned Plea
  • 36. Resources: http://rubyamf.googlecode.com http://groups.google.com/group/rubyamf http://github.com/thillerson/rubyamf
  • 37. Your Bob Father You Thanks! Tony Hillerson http://slideshare.com/thillerson http://github.com/thillerson http://thillerson.blogspot.com http://effectiveui.com Twitter: thillerson Brightkite: thillerson 39