integrating flex and rails with rubyamf

39
Flex and Rails with RubyAMF Tony Hillerson Software Architect EffectiveUI RailsConf

Upload: best-tech-videos

Post on 10-Apr-2015

859 views

Category:

Documents


2 download

DESCRIPTION

RubyAMF is a Rails plug-in that allows easy, fast integration between Flex apps and Rails using Adobe’s open format for transferring typed data to/from Flash apps. We’ll walk through building a Flex application powered by a Rails back-end service. You’ll see how to work with translation to native objects in both directions, working with hierarchical data and more advanced configuration options.

TRANSCRIPT

Page 1: Integrating Flex and Rails with RubyAMF

Flex and Rails with RubyAMF

Tony HillersonSoftware ArchitectEffectiveUIRailsConf

Page 2: Integrating Flex and Rails with RubyAMF

Code and Slides:http://github.com/thillerson/preso_code/

Page 3: Integrating Flex and Rails with RubyAMF

Sample du Jour: Stuff

Page 4: Integrating Flex and Rails with RubyAMF
Page 5: Integrating Flex and Rails with RubyAMF

Why Flex and Rails?

They Make The Great Tag Team!

Page 6: Integrating Flex and Rails with RubyAMF

[SKIP INTRO]

Page 7: Integrating Flex and Rails with RubyAMF

What are the Options?

Page 8: Integrating Flex and Rails with RubyAMF

XML

Page 9: Integrating Flex and Rails with RubyAMF

XML is the Default Option

Page 10: Integrating Flex and Rails with RubyAMF

# POST /contexts# POST /contexts.xmldef 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 => "new" } format.xml { render :xml => @context.errors, :status => :unprocessable_entity } end endend

Page 11: Integrating Flex and Rails with RubyAMF

JSON

Javascript Object Notation

Page 12: Integrating Flex and Rails with RubyAMF

JSON is in Rails Tooformat.json { render :json => @context.to_json }

http://as3corlib.googlecode.com

var obj:Object = JSON.decode(jsonString)

Page 13: Integrating Flex and Rails with RubyAMF

AMF

Action Message Format

Page 14: Integrating Flex and Rails with RubyAMF

AMF is the Good Stuff

Buck Thinks it’s Great!

Page 15: Integrating Flex and Rails with RubyAMF

RubyAMF

http://rubyamf.orghttp://rubyamf.googlecode.com

Page 16: Integrating Flex and Rails with RubyAMF

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 "application/x-amf", :amf• config/routes.rb modified: ActionController::Routing::Routes.draw do |map| map.rubyamf_gateway 'rubyamf_gateway', :controller => 'rubyamf', :action => 'gateway' end

Page 17: Integrating Flex and Rails with RubyAMF

Con"guring RubyAMFmodule RubyAMF module Configuration ClassMappings.translate_case = true ClassMappings.assume_types = false ParameterMappings.scaffolding = true ClassMappings.register( :actionscript => 'Task', :ruby => 'Task', :type => 'active_record', #:associations => ["context"], :attributes => ["id", "label", "context_id", "completed_at", "created_at", "updated_at"]) endend

Page 18: Integrating Flex and Rails with RubyAMF

Con"guring RubyAMFClassMappings.translate_case = false

public var created_at:Date;

ClassMappings.translate_case = true

public var createdAt:Date; // created_at in rails

Page 19: Integrating Flex and Rails with RubyAMF

Con"guring RubyAMFClassMappings.assume_types = true

class Context < ActiveRecord::Base

[RemoteClass(alias="Context")]public class Context {

matches

for free

Page 20: Integrating Flex and Rails with RubyAMF

Con"guring RubyAMFClassMappings.assume_types = false

class Context < ActiveRecord::Base

[RemoteClass(alias="Context")]public class Context {

matches

ClassMappings.register( :actionscript => 'Context', :ruby => 'Context', :type => 'active_record', :attributes => ["id", ...])

with registration

Page 21: Integrating Flex and Rails with RubyAMF

Con"guring RubyAMFParameterMappings.scaffolding = false

save(context);def save @context = params[0]becomes

ParameterMappings.scaffolding = true

save( {context:context});

def save @context = params[:context]becomes

Page 22: Integrating Flex and Rails with RubyAMF

Connecting to Rails via RubyAMF

<mx:RemoteObject id="contextsService" destination="rubyamf" endpoint="http://localhost:3000/rubyamf_gateway/" source="ContextsController" showBusyCursor="true"/>public function save(context:Context):void { var call:AsyncToken =

contextsService.save({context:context}); call.addResponder(responder);}

Page 23: Integrating Flex and Rails with RubyAMF

Development Work#ow

Page 24: Integrating Flex and Rails with RubyAMF

1. Generate and Migrate$ script/generate rubyamf_scaffold context label:string

$ rake db:migrate

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 endend

Page 25: Integrating Flex and Rails with RubyAMF

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("\n")) end end end end

Page 26: Integrating Flex and Rails with RubyAMF

2. Sample Datawork: id: 1 label: Work

home: id: 2 label: Home

anarco_syndicalist_commune_biweekly_meetings: id: 3 label: Anarcho-syndicalist Commune Bi-weekly Meetings

Page 27: Integrating Flex and Rails with RubyAMF

3. Test

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

class Context < ActiveRecord::Base validates_presence_of :label

Page 28: Integrating Flex and Rails with RubyAMF

4. Con"gure

ClassMappings.register( :actionscript => 'Context', :ruby => 'Context', :type => 'active_record', #:associations => ["tasks"], :attributes => ["id", "label", "created_at", "updated_at"])

Page 29: Integrating Flex and Rails with RubyAMF

5. Wire<mx:RemoteObject id="contextsService" destination="rubyamf" endpoint="http://localhost:3000/rubyamf_gateway/" source="ContextsController" showBusyCursor="true"/>

<mx:RemoteObjectid="tasksService"

destination="rubyamf" endpoint="http://localhost:3000/rubyamf_gateway/" source="TasksController" showBusyCursor="true"/>

Page 30: Integrating Flex and Rails with RubyAMF

5. Wirepublic 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);}

Page 31: Integrating Flex and Rails with RubyAMF

5. Wirepublic 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; ...}

Page 32: Integrating Flex and Rails with RubyAMF

X. Rinse and Repeat

Page 33: Integrating Flex and Rails with RubyAMF

The Future

Page 34: Integrating Flex and Rails with RubyAMF

GemPlugin + GemC Extension

Page 35: Integrating Flex and Rails with RubyAMF

GemPlugin

C Extension

Page 36: Integrating Flex and Rails with RubyAMF
Page 37: Integrating Flex and Rails with RubyAMF

An Impassioned Plea

Page 39: Integrating Flex and Rails with RubyAMF

Thanks!Tony Hillersonhttp://slideshare.com/thillersonhttp://github.com/thillersonhttp://thillerson.blogspot.comhttp://effectiveui.com

Twitter: thillersonBrightkite: thillerson

39

You

YourFather

Bob