SlideShare une entreprise Scribd logo
1  sur  6
Télécharger pour lire hors ligne
Subscribe Now for FREE! refcardz.com
                                                                                                                                                                         tech facts at your fingertips

                                        CONTENTS INCLUDE:
                                        n	
                                              About Flexible Rails



                                                                                              Flexible Rails: Flex 3 on Rails 2
                                        	n	
                                              Overview of Rails 2
                                        n	
                                              Overview of Flex 3
                                        n	
                                              Flex 3 and Rails 2 Together
                                        n	
                                              Building a Flex + Rails
                                              Application                                                                                                                  By Peter Armstrong
                                        n	
                                              Hot Tips and more...


                                                                                                                                         The typical sequence is as follows:
                                                ABOUT FLEXIBLE RAILS
                                                                                                                                         1. A user visits a particular URL in their web browser (makes
                                                Simply put, Flex is the most productive way to build the UI                                 an HTTP request).
                                                of Rich Internet Applications, and Rails is a very productive                            2. This request goes over the Internet to the web server in
                                                way to rapidly build a database-backed CRUD application,                                    which Rails is running.
                                                thanks to ActiveRecord (the ORM layer of Rails) and thanks                               3. That web server passes the request to the routing code in
                                                to the principles of Convention Over Configuration and                                      Rails, which triggers the appropriate controller method call
                                                DRY (Don’t Repeat Yourself). This refcard shows you how to                                  based on the routes defined in configroutes.rb.
                                                get started. It provides an overview of Flex and Rails, how
                                                                                                                                         4. The controller method is called. It communicates with
                                                they can be used together and then building a simple Flex
                                                                                                                                            various ActiveRecord models (which are persisted to and
                                                + Rails application using XML over HTTPService to have
                                                                                                                                            retrieved from a database of your choosing). The controller
                                                the Flex client talk to a RESTful Rails server. Since we’ll use
                                                                                                                                            method can then do one of two things:
                                                RESTful Rails controllers, the Rails controller methods will
                                                also support the traditional HTML views.                                                       1. Set some instance variables and allow a view
                                                                                                                                                  template (a specially named .html.erb file, for
                                                                                                                                                  example) to be used to produce HTML, XML, or
 www.dzone.com




                                                OvERvIEw OF RAILS 2                                                                               JavaScript, which is sent to the browser.
                                                                                                                                               2. Bypass the view mechanism and do rendering
                                                Rails provides a standard three-tier architecture (presentation tier,
                                                                                                                                                  directly via a call to the render method. This method
                                                model tier, persistence tier) as well as a Model-View-Controller
                                                                                                                                                  can produce plain text (render :text => quot;fooquot;), XML
                                                (MVC) architecture. As shown in Figure 1, Rails takes care of
                                                                                                                                                  (render :text => @task), and so on.
                                                everything between the web server and the database.

                                                                                                                                          OvERvIEw OF FLEX 3
                                                                           Web Browser                           Client

                                                                                                                                         In Flex 3, you write code in MXML (XML files with a .mxml
                                                                                                                                         extension; M for Macromedia) and ActionScript (text files with
                                                                   HTTP Request                       HTML
                                                          http://www.pomodo.com/tasks/list             XML       Internet                a .as extension) files and compile them into a SWF file, which
                                                                                                    JavaScript                           runs in the Flash player. This SWF is referenced by an HTML
                                                   render :text, render :xml                                                             file, so that when a user with a modern web browser loads
                                                                                                                                         the HTML file, it plays the Flash movie (prompting the user
Flexible Rails: Flex 3 on Rails 2




                                                                                       Rails                                             to download Flash 9 if it’s not present). The SWF contained in
                                                                                                                 Presentation            the web page can interact with the web page it’s contained
                                                             ActionController::Routing::Routes                   Tier                    in and with the server it was sent from.

                                                       ActionController                       ActionView
                                                         (Controller)                           (View)
                                                                                                                                                                   Get More Refcardz
                                                                                                                                                                               (They’re free!)
                                                                               ActiveRecord
                                                                                 (Model)                         Model Tier                                          n   Authoritative content
                                                                                                                                                                     n   Designed for developers
                                                                                                                                                                     n   Written by top experts
                                                                                                                                                                     n   Latest tools & technologies
                                                                                  MySQL                          Persistence
                                                                                                                                                                     n   Hot tips & examples
                                                                                PostgreSQL                       Tier                                                n   Bonus content online
                                                                                  Oracle
                                                                                 DB2, etc.                                                                           n   New issue every 1-2 weeks

                                                Figure 1: Rails provides a standard three-tier architecture (presenta-                                Subscribe Now for FREE!
                                                tion tier, model tier, persistence tier) as well as a Model-View-Controller                                Refcardz.com
                                                architecture.


                                                                                                                      DZone, Inc.   |   www.dzone.com
2
                                                                                                                                        Flexible Rails: Flex 3 on Rails 2
      tech facts at your fingertips




    FLEX 3 AND RAILS 2 TOgEThER                                                                INSTALLINg EvERyThINg

Flex and Rails can be used together with XML over HTTPService                                 To get started, various software packages need to be installed.
or with Action Message Format. The XML over HTTPService                                       The full instructions can be found in chapter 2 of Flexible Rails
approach is shown in Figure 2 below.                                                          (Manning Publications). Here’s what is needed:
                                                                                              1. Ruby 1.8.6
                   Web Browser with Flash Player 9                                            2. RubyGems 1.0.0 (or higher)

               Web                                                       Client               3. Rails. 2.0.2 (or higher)
                                         Flex app (SWF)
               Page
                                                                                              4. Flex Builder 3

      render :text, render :xml                                                               5. SQLite
                                                                   XML   Internet             6. The sqlite3 gem, installed by running this command:
                                    HTTP Request
                           http://www.pomodo.com/tasks/list                                      C:>gem install sqlite3-ruby

                                                                         Presentation         Resource        URL                                      Notes
                                             Rails                       Tier
                                                                                              RubyonRails     http://rubyonrails.org/down

                  ActionController::Routing::Routes                                           HiveLogic       http://hivelogic.com/articles/2008/02/
                                                                                                              ruby-rails-leopard

                                                                                              SQLite          http://www.sqlite.org/download.html      On Windows, download
           ActionController                               ActionView
                                                                                                                                                       sqlite-3_5_5.zip or higher
             (Controller)                                   (View)                                                                                     and sqlitedll-3_5_5.zip or
                                                                                                                                                       higher, and unzip both of
                                                                                                                                                       them into C:WINDOWS
                                                                         Model Tier                                                                    system32

                                      ActiveRecord
                                        (Model)
                                                                                               BUILDINg A FLEX + RAILS APPLICATION
                                                                         Persistence
                                                                         Tier                 The world doesn’t need Yet Another Todo List, but let’s build
                                                                                              one. Unlike most Rails tutorials, we will assume you are using
                                                                                              Windows. (Rails has “crossed the chasm”, so this is now becom-
                                                                                              ing the correct assumption.)
                               MySQL , PostgreSQL                                             Open a command prompt or Terminal window and run the fol-
                                Oracle, DB2, etc.
                                                                                              lowing commands:
    Figure 2.                                                                                     C:>rails todo

                                                                                              This installs the SQLite3 gem and then creates a new Rails appli-
The AMF waters are a bit muddier: there are currently three
                                                                                              cation which by default uses the SQLite database. (The default
ways that Flex can talk to Rails using AMF and RemoteObject:
                                                                                              in Rails 2.0.1 and below was MySQL.)
	     n	
           RubyAMF                                                                            Next, create a couple of directories:
	     n	
           WebORB for Rails                                                                       C:>cd todo
      n	
           BlazeDS (with Rails running on JRuby).                                             	   C:todo>mkdir	appflex
                                                                                                  C:todo>mkdir publicbin

                                                                                              Next, switch to Flex Builder 3 and create the new Flex project:
                         Flash 9? Are you kidding me?
                                                                                              1. Do File > New > Flex Project...
            FYI          The reference to Flash 9 earlier may have set off                    2. Choose to create a new project named Todo in c:todo
                         alarm bells in your head: “Isn’t Flash 9 somewhat
                                                                                              3. Leave its type set to “Web application” and its “Application
      new? How many people will be able to run my app?” Well,                                    server type” set to None and click Next
      while not everyone has Flash 9, most do: according to http://                           4. Set the Output folder of the Flex project to publicbin and
      www.adobe.com/products/player_census/flashplayer/                                          click Next

      version_ penetration.html Flash 9 has reached near ubiquity:                            5. Set the “Main source folder” to appflex, leave the “Main
                                                                                                 application file” as Todo.mxml and set the output folder
      97.3% in US/Canada, 96.5% in Europe and 98.0% in Japan.
                                                                                                 to http://localhost:3000/bin and click Finish. Your new Flex
      This is better than Windows.                                                               project will be created. (Note that public isn’t part of the
                                                                                                 path since it’s the root; 3000 is the default port for the server).


                                                                           DZone, Inc.   |   www.dzone.com
3
                                                                                                                                 Flexible Rails: Flex 3 on Rails 2
    tech facts at your fingertips




                                                                                                The TasksController (in appcontrollerstasks_controller.rb)
                      We are using appflex as the root of all our                              looks like this:
     Hot              Flex code—in larger team environments it’s
                                                                                                     class TasksController < ApplicationController
     Tip              advisable to create a Flex project as a sibling
                                                                                                       # GET /tasks
                      of the Rails app (say, c:todoclient) and set
                      its output folder to go inside c:todopublic                            	    	 #	GET	/tasks.xml
                      bin. This way, different team members can use                             	    	 def	index
                      different IDEs for the client and server projects:                        		   	 	   @tasks	=	Task.find(:all)
                      for example, Aptana and Flex Builder are both                                        respond_to do |format|
                      Eclipse-based, and interesting things can                                 	    	 	   	 format.html	#	index.html.erb
                      happen when you nest projects.                                            	    	 	   	 format.xml		{	render	:xml	=>	@tasks	}
                                                                                                           end
Building a Flex + Rails Application, continued                                                         end
Next, let’s create a new Task resource using the now-RESTful                                           # GET /tasks/1
scaffold command.                                                                               	    	 #	GET	/tasks/1.xml
    C:todo>ruby scriptgenerate scaffold Task name:string                                             def show
Here we are creating a Task that has a name attribute, which                                    	    	 	   @task	=	Task.find(params[:id])
is a string. Running this command generates the various Rails                                              respond_to do |format|
files, including the model, helper, controller, view templates,                                              format.html # show.html.erb
tests and database migration. We’re going to make the simplest                                  	    	 	   	 format.xml		{	render	:xml	=>	@task	}
Todo list in history: Tasks have names, and nothing else. Further-                                         end
more, there are no users even, just a global list of tasks.
                                                                                                       end
The Task model looks like this:                                                                        # GET /tasks/new
    class Task < ActiveRecord::Base                                                             	    	 #	GET	/tasks/new.xml
    end                                                                                                def new
Because the Task model extends (with <) ActiveRecord::Base, it                                             @task = Task.new
can be mapped to the equivalent database tables. Because we                                                respond_to do |format|
also created the controllers and views with the scriptgenerate                                              format.html # new.html.erb
scaffold command and ensured that we specified all the fields,                                  	    	 	   	 format.xml		{	render	:xml	=>	@task	}
we can use a prebuilt web interface to Create, Read, Update,
                                                                                                           end
and Delete (CRUD) them.
                                                                                                       end
The CreateTasks migration that was created (in dbmigrate001_
                                                                                                       # GET /tasks/1/edit
create_tasks.rb) looks like this:
                                                                                                       def edit
    class CreateTasks < ActiveRecord::Migration                                                 	    	 	   @task	=	Task.find(params[:id])
       def self.up
                                                                                                       end
         create_table :tasks do |t|
                                                                                                       # POST /tasks
            t.string :name
            t.timestamps                                                                        	    	 #	POST	/tasks.xml
         end                                                                                           def create
       end                                                                                      	    	 	   @task	=	Task.new(params[:task])
       def self.down                                                                                       respond_to do |format|
         drop_table :tasks                                                                                   if @task.save
       end
                                                                                                	    	 	   	 	 flash[:notice]	=	'Task	was	successfully	created.'
    end
                                                                                                	    	 	   	 	 format.html	{	redirect_to(@task)	}
 CreateTasks Class          Extends ActiveRecord::Migration                                     	    	 	   	 	 format.xml		{	render	:xml	=>	@task,
 Up method                  Creates a new tasks table with the create_table method call,        	    	 	   	 	 	 :status	=>	:created,	:location	=>	@task	}
                            which takes a block that does the work
                                                                                                             else
 Down method                Deletes it with the drop_table call
                                                                                                	    	 	   	 	 format.html	{	render	:action	=>	quot;newquot;	}

In the up method, we specify the data types of each new                                         	    	 	   	 	 format.xml		{	render	:xml	=>	@task.errors,
column, such as string in our case, or boolean, integer or text.                                	    	 	   	 	 	 :status	=>	:unprocessable_entity	}
These are then mapped to the equivalent database data types:                                                 end
for example, boolean becomes a tinyint(1) in MySQL. The                                                    end
timestamps call adds two columns: created_at and updated_                                              end
at, which Rails treats specially, ensuring that they’re automatically
                                                                                                       # PUT /tasks/1
set. This is often a good thing to have, so we’ll leave them
                                                                                                	    	 #	PUT	/tasks/1.xml
there even though they won’t be needed in this build.                                                                                                          →

                                                                             DZone, Inc.   |   www.dzone.com
4
                                                                                                                          Flexible Rails: Flex 3 on Rails 2
    tech facts at your fingertips




Building a Flex + Rails Application, continued
                                                                                                        What’s REST?
         def update
                                                                                             FYI        REST (Representational State Transfer) is a
						 	      @task	=	Task.find(params[:id])
                                                                                                        way of building web services that focuses on
              respond_to do |format|
                                                                                          simplicity and an architecture style that is “of the web.”
							 	     	 if	@task.update_attributes(params[:task])
                                                                                          This can be described as a Resource Oriented Architecture
										    	 	 flash[:notice]	=	'Task	was	successfully	updated.'
										    	 	 format.html	{	redirect_to(@task)	}
                                                                                          (ROA); see RESTful Web Services published by O’Reilly Media
										    	 	 format.xml		{	head	:ok	}
                                                                                          for details. Briefly, the reason to use a RESTful design in Rails
                   else                                                                   is that it helps us organize our controllers better, forces
										    	 	 format.html	{	render	:action	=>	quot;editquot;	}                                us to think harder about our domain, and gives us a nice
										    	 	 format.xml		{	render	:xml	=>	@task.errors,                              API for free.
											 	 	 	 :status	=>	:unprocessable_entity	}
                  end
                                                                                      Next, we run the new migration that was created (CreateTasks)
              end                                                                     when we ran the scaffold command:
         end
                                                                                          C:todo>rake db:migrate
         # DELETE /tasks/1
                                                                                      At this point we run the server:
			 	 #	DELETE	/tasks/1.xml
         def destroy                                                                      C:todo>ruby scriptserver
						 	      @task	=	Task.find(params[:id])                                          and play with creating, editing and deleting tasks.
              @task.destroy
                                                                                      1. Go to http://localhost:3000/tasks to see an empty task list.
              respond_to do |format|
							 	     	 format.html	{	redirect_to(tasks_url)	}                                2. Click the New link to go to http://localhost:3000/tasks/new.
							 	     	 format.xml		{	head	:ok	}                                              3. Create a new Task with a name of “drink coffee” and
              end                                                                        click Create.
         end                                                                          4. Go back to http://localhost:3000/tasks to see the task list
         end                                                                             with the new “drink coffee” task present.

This new controller which was generated for us contains the                           Now, let’s do something interesting and hook this up to Flex.
seven RESTful controller methods, which are explained in                              Currently, the Todo.mxml file looks like this:
the following table (inspired by David Heinemeier Hansson’s
                                                                                          <?xml	version=quot;1.0quot;	encoding=quot;utf-8quot;?>
Discovering a World of Resources on Rails presentation—
                                                                                      	   <mx:Application	xmlns:mx=quot;http://www.adobe.com/
media.rubyonrails.org/presentations/worldofresources.pdf,
                                                                                      	   2006/mxmlquot;	layout=quot;absolutequot;>
slide 7—as well as the table on p. 410 of Agile Web Develop-
ment with Rails, 2nd ed. (The Pragmatic Programmers),                                 	   </mx:Application>

and the tables in Geoffrey Grosenbach’s REST cheat sheet                              The top-level tag is mx:Application; the root of a Flex ap-
http://topfunky.com/clients/peepcode/REST-cheatsheet.pdf):                            plication is always an Application. The mx: part identifies the
                                                                                      XML namespace that the Application component is from. By
#     Method         Sample           Pretend   Actual   Corres-   Corres-            default, an Application uses an absolute layout, where you
                     URL paths        HTTP      HTTP     ponding   ponding
                                      Method    Method   CRUD      SQL                specify the x,y of each top level container and component.
                                                         Method    Method
                                                                                      What we want to build is the following application:
1     index          /tasks           GET       GET      READ      SELECT
                     /tasks.xml

2     show           /tasks/1         GET       GET      READ      SELECT
                     /tasks/1.xml

3     new            /tasks/new       GET       GET      —         —
                     /tasks/new.xml

4     edit           /tasks/1/edit    GET       GET      READ      SELECT

5     create         /tasks           POST      POST     CREATE    INSERT
                     /tasks.xml

6     update         /tasks/1         PUT       POST     UPDATE    UPDATE
                     /tasks/1.xml

7     destroy        /tasks/1         DELETE    POST     DELETE    DELETE
                     /tasks/1.xml

Table 1: The seven standard RESTful controller methods                                Figure 3: The Simple Todo Flex Application


                                                                   DZone, Inc.   |   www.dzone.com
5
                                                                                                                     Flexible Rails: Flex 3 on Rails 2
      tech facts at your fingertips




Building a Flex + Rails Application, continued                                  			 <mx:Panel	title=quot;Simple	Todoquot;	width=quot;100%quot;		             	
We want the ability to create new tasks, delete tasks and rename                	    height=quot;100%quot;>
them inline in the list. Furthermore, we want to do this in the least           						 <mx:HBox	width=quot;100%quot;	paddingLeft=quot;5quot;	
                                                                                     	
amount of code possible. Normally, I’d build this iteratively; but              	    	 paddingRight=quot;5quot;
we’ll build it all at once. Modify the Todo.mxml file to look like this:        							 	    paddingTop=quot;5quot;>
      <?xml	version=quot;1.0quot;	encoding=quot;utf-8quot;?>                                    							 	    <mx:Label	text=quot;New	Taskquot;/>
	     <mx:Application	                                                          							 	    <mx:TextInput	id=quot;newTaskTIquot;	width=quot;100%quot;
	     	 xmlns:mx=quot;http://www.adobe.com/2006/mxmlquot;                               										   	 enter=quot;createTask()quot;/>
			 	 width=quot;100%quot;	height=quot;100%quot;	layout=quot;verticalquot;                              							 	    <mx:Button	label=quot;Createquot;	click=quot;createTask()quot;/>
			 	 backgroundGradientColors=quot;[#000000,	#CCCCCC]quot;                             						 </mx:HBox>
			 	 creationComplete=quot;svcTasksList.send()quot;>                                   						 <mx:List	id=quot;taskListquot;	width=quot;100%quot;	height=quot;100%quot;
	     <mx:Script>                                                               							 	    editable=quot;truequot;	labelField=quot;namequot;
	     <![CDATA[                                                                 							 	    dataProvider=quot;{tasksXLC}quot;
			 	 import	mx.events.ListEvent;                                               							 	    itemEditEnd=quot;updateSelectedTask(event)quot;/>
			 	 import	mx.controls.Alert;                                                 						 <mx:ControlBar	width=quot;100%quot;	horizontalAlign=quot;centerquot;>
		    	 import	mx.rpc.events.ResultEvent;                                       							 	    <mx:Button	label=quot;Deletequot;	width=quot;100%quot;	height=quot;30quot;
			 	 private	function	createTask():void	{                                      										   	 enabled=quot;{taskList.selectedItem	!=	null}quot;
						 	      svcTasksCreate.send();                                            										   	 click=quot;deleteTask(XML(taskList.selectedItem))quot;/>
			 	 }                                                                         						 </mx:ControlBar>
			 	 private	function	deleteTask(task:XML):void	{                              			 </mx:Panel>
						 	      svcTasksDestroy.url	=	quot;/tasks/quot;	+	task.id	+	quot;.xmlquot;;               </mx:Application>
						 	      svcTasksDestroy.send({_method:	quot;DELETEquot;});
                                                                                 This is a complete Flex application in 67 lines of code! Compile
			 	 }
                                                                                 and run the application by clicking the green “play” button: you
			 	 private	function	updateSelectedTask(event:ListEvent):	                     will see the screen shown in Figure 3.
	     	 void	{
						 	      var	itemEditor:TextInput	=                                         A Quick Highlight Tour of this Code:
							 	     	 TextInput(event.currentTarget.itemEditorInstance);
						 var	selectedTask:XML	=	XML(event.itemRenderer.data);                            1  We use a vertical layout to make the components
						 if	(selectedTask.name	==	itemEditor.text)	return;                                  flow vertically. Other choices are horizontal (for
                                                                                    horizontal flow) and absolute (which we saw before). The
						 var	params:Object	=	new	Object();
                                                                                    backgroundGradientColors specify the start and end of the
						 params['task[name]']	=	itemEditor.text;
                                                                                    gradient fill for the background.
						 params['_method']	=	quot;PUTquot;;
						 svcTasksUpdate.url	=	quot;/tasks/quot;+	selectedTask.id	+quot;.xmlquot;;
						 svcTasksUpdate.send(params);                                                        We define a HTTPService svcTasksList, which does
                                                                                       2
			 }                                                                                      a GET to /tasks.xml (thus triggering the index action of
			 private	function	listTasks():void	{                                             the TasksController) and specifies a resultFormat of e4x so
						 svcTasksList.send();                                                         the result of the service can be handled with the new E4X
			 }
                                                                                    XML API. We then take the lastResult of this service, which
                                                                                    is an XML document, get its children (which is an XMLList
]]>
                                                                                    of the tasks), and make this be the source of an XMLList-
</mx:Script>                                                                        Collection called tasksXLC. We do this with a binding to
		    <mx:HTTPService	id=quot;svcTasksCreatequot;	url=quot;/tasks.xmlquot;                          the source attribute. Similarly, we define svcTasksCreate,
						 contentType=quot;application/xmlquot;	resultFormat=quot;e4xquot;                             svcTasksUpdate and svcTasksDestroy to be used for the
						 method=quot;POSTquot;	result=quot;listTasks()quot;>                                          other CRUD operations.
						 <mx:request>
							 	     <task><name>{newTaskTI.text}</name></task>
						 </mx:request>                                                                   3   We can pass data to Rails via data bindings using
			 </mx:HTTPService>                                                                      curly braces { } inside XML (as shown in svcTaskCreate)
                                                                                    or by sending form parameters that Rails would be expecting
			 <mx:HTTPService	id=quot;svcTasksListquot;	url=quot;/tasks.xmlquot;
                                                                                    (as shown in the updateSelectedTask method).
						 resultFormat=quot;e4xquot;	method=quot;POSTquot;/>
			 <mx:HTTPService	id=quot;svcTasksUpdatequot;	resultFormat=quot;e4xquot;
						 method=quot;POSTquot;	result=quot;listTasks()quot;/>
                                                                                       4  For svcTasksUpdate and svcTasksDestroy we are
			 <mx:HTTPService	id=quot;svcTasksDestroyquot;	resultFormat=quot;e4xquot;
                                                                                          not setting the url property statically, but instead
	     	 method=quot;POSTquot;	result=quot;listTasks()quot;/>                                        dynamically setting it to include the id of the task we are
	     <mx:XMLListCollection	id=quot;tasksXLCquot;                                           updating or destroying.
						 source=quot;{XMLList(svcTasksList.lastResult.children())}quot;/>


                                                              DZone, Inc.   |   www.dzone.com
6
                                                                                                                                                                                             Flexible Rails: Flex 3 on Rails 2
               tech facts at your fingertips




                       A hack: you can’t send HTTP PUT or DELETE from the                                                           RESOURCES
                5
                       Flash player in a web browser, so we need to fake it.
              Luckily, since you can’t send PUT or DELETE from HTML in                                                             Organization         URL                                         Information
              a web browser either, Rails already has a hack in place—we                                                           Manning              http://www.manning.com/armstrong            Book: Flexible Rails—provides
              just need to know how to use it. Rails will look for a _method                                                       Publications                                                     a code-focused, iterative
                                                                                                                                                                                                    tutorial introduction to using
              parameter in its params hash and, if there is one, use it instead                                                                                                                     Flex with Rails.
              of the actual HTTP method. So, if we do a form POST with                                                                                  http://www.manning.com/armstrong2           Book: Enterprise Flexible
              a _method of PUT, Rails will pretend we sent an HTTP PUT. (If                                                                                                                         Rails—provides the definitive
                                                                                                                                                                                                    tutorial introduction to the
              you’re thinking that it’s ironic that at the core of a “cleaner”                                                                                                                      Ruboss Framework.
              architecture is a giant hack, well, you’re not alone.) This _meth-
                                                                                                                                   Ruboss               http://www.ruboss.com                       The Ruboss Framework: The
              od can be added to a params Object (params['_method']                                                                Technology                                                       Open Source Framework
              = quot;PUTquot;;) or to an anonymous object (svcTasksDestroy.                                                                Corporation                                                      Which Puts Flex On Rails.
                                                                                                                                                                                                    Ruboss taking the Flex + Rails
              send({_method: quot;DELETEquot;});) If you’re new to Flex, {} can                                                                                                                             combination further, making
              be used for both anonymous object creation and for data                                                                                                                               it even easier and more
                                                                                                                                                                                                    accessible to the Enterprise.
            continued from page 5of an anonymous object like a hash in Ruby.
              binding. Think



     ABOUT ThE AUThOR                                                                                                                                                        RECOMMENDED BOOK

                            Peter Armstrong                                                                                                                                                              Flexible Rails is a book
                      Peter Armstrong is the CEO and Co-Founder of Ruboss Technology Corporation                                                                                                         about how to use Ruby
                      (http://ruboss.com), a self-funded RIA startup in Vancouver, BC, Canada. Peter is                                                                                                  on Rails and Adobe Flex
                      also the co-creator of the open source Ruboss Framework, the RESTful way to develop                                                                                                to build next-generation
                      Adobe Flex and AIR applications that easily int egrate with Ruby on Rails. Peter is                                                                                                rich Internet applications
                      the author of Flexible Rails and Enterprise Flexible Rails. Peter has been developing                                                                                              (RIAs). The book takes
                                                                                                                                                                                                         you to the leading edge
                      rich client applications for over 7 years. He has worked with Flex full-time since July
                                                                                                                                                                                                         of RIA development,
     2004, including being a key part of the Dorado Product Engineering team that won the 2006 Adobe
                                                                                                                                                                                                         presenting examples in
     MAX Award for RIA/Web Development ( http://my.adobe.acrobat.com/doradomaxpresentation/).
                                                                                                                                                                                                         Flex 3 and Rails 2.
     He is the organizer of The Vancouver Ruby/Rails Meetup group and is a frequent conference
     speaker on using Flex and Rails together.
                                                                                                                                                                                                  BUy NOw
     Blog
                                                                                                                                                                             books.dzone.com/books/flexible-rails
     http://peterarmstrong.com/




 Want More? Download Now. Subscribe at refcardz.com
 Upcoming Refcardz:                                           Available:
 n   	 C#                                                     Published June 2008                                                                                                     FREE
 n   	 GlassFish Application Server                           n   	 jQuerySelectors

 n   		RSS and Atom                                           n   	 Design Patterns

 n   		Apache Struts 2                                        Published May 2008
                                                              n   	 Dependency Injection in EJB 3
 n   		MS Silverlight 2                                                                                                                                                 Windows
     		NetBeans IDE 6 Java Editor                             Published April 2008                                                                                      PowerShell
 n

                                                                  	 Spring Configuration                                                                                                                           GWT Style,
                                                              n
                                                                                                                                                                        Published May 2008
     		Groovy                                                                                                                                                                                                    Configuration
 n
                                                                  	 Getting Started with Eclipse
                                                                                                                                                                                                            and JSNI Reference
                                                              n



                                                                  	 Getting Started with Ajax
                                                                                                                                                                                                             Published April 2008
                                                              n




                                                                                                                            DZone, Inc.
                                                                                                                            1251 NW Maynard
                                                                                                                                                                                             ISBN-13: 978-1-934238-08-0
                                                                                                                            Cary, NC 27513
                                                                                                                                                                                             ISBN-10: 1-934238-08-2
                                                                                                                                                                                                                            50795
                                                                                                                            888.678.0399
DZone communities deliver over 3.5 million pages per month to                                                               919.678.0300
more than 1.5 million software developers, architects and designers.
                                                                                                                            Refcardz Feedback Welcome
DZone offers something for every developer, including news,                                                                 refcardz@dzone.com
                                                                                                                                                                                                                                         $7.95




tutorials, blogs, cheatsheets, feature articles, source code and more.                                                      Sponsorship Opportunities                                     9 781934 238080
“DZone is a developer’s dream,” says PC Magazine.                                                                           sales@dzone.com

Copyright © 2008 DZone, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by means electronic, mechanical,                             Version 1.0
photocopying, or otherwise, without prior written permission of the publisher. Reference: Flexible Rails: Flex 3 on Rails 2, Peter Armstrong. Manning Publications, 2008.

Contenu connexe

En vedette (10)

Funny Helicopter Pictures
Funny Helicopter PicturesFunny Helicopter Pictures
Funny Helicopter Pictures
 
Test
TestTest
Test
 
Branum mla 2012
Branum mla 2012Branum mla 2012
Branum mla 2012
 
Poverty Imges
Poverty ImgesPoverty Imges
Poverty Imges
 
Netbeans
NetbeansNetbeans
Netbeans
 
Semantic Web Technologies -metadata, ontology, logic, agent-
Semantic Web Technologies -metadata, ontology, logic, agent-Semantic Web Technologies -metadata, ontology, logic, agent-
Semantic Web Technologies -metadata, ontology, logic, agent-
 
America chooses barack obama
America chooses barack obamaAmerica chooses barack obama
America chooses barack obama
 
Girls Just Wanna Have Fun
Girls Just Wanna Have FunGirls Just Wanna Have Fun
Girls Just Wanna Have Fun
 
The strategic position and action evaluation matrix
The strategic position and action evaluation matrixThe strategic position and action evaluation matrix
The strategic position and action evaluation matrix
 
Grecia Power Point 1 [1]
Grecia Power Point 1 [1]Grecia Power Point 1 [1]
Grecia Power Point 1 [1]
 

Similaire à Flexiblerails

Intro to web services
Intro to web servicesIntro to web services
Intro to web services
Neil Ghosh
 
dotnet_remoting
dotnet_remotingdotnet_remoting
dotnet_remoting
OPENLANE
 
Rails
RailsRails
Rails
SHC
 

Similaire à Flexiblerails (20)

Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Ruby Rails Web Development
Ruby Rails Web DevelopmentRuby Rails Web Development
Ruby Rails Web Development
 
Ruby Rails Web Development
Ruby Rails Web DevelopmentRuby Rails Web Development
Ruby Rails Web Development
 
Ruby Rails Web Development
Ruby Rails Web DevelopmentRuby Rails Web Development
Ruby Rails Web Development
 
Marata
MarataMarata
Marata
 
RIA Data and Security, 2007
RIA Data and Security, 2007RIA Data and Security, 2007
RIA Data and Security, 2007
 
Intro to web services
Intro to web servicesIntro to web services
Intro to web services
 
Aspose pdf
Aspose pdfAspose pdf
Aspose pdf
 
Linq To XML Overview
Linq To XML OverviewLinq To XML Overview
Linq To XML Overview
 
dotnet_remoting
dotnet_remotingdotnet_remoting
dotnet_remoting
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Ruby On Rails Siddhesh
Ruby On Rails SiddheshRuby On Rails Siddhesh
Ruby On Rails Siddhesh
 
Rails
RailsRails
Rails
 
Rails interview questions
Rails interview questionsRails interview questions
Rails interview questions
 
Linq to xml
Linq to xmlLinq to xml
Linq to xml
 
RubyOnRails
RubyOnRailsRubyOnRails
RubyOnRails
 
Ruby Rails Web Development.pdf
Ruby Rails Web Development.pdfRuby Rails Web Development.pdf
Ruby Rails Web Development.pdf
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on Rails
 
Hibernate interview questions
Hibernate interview questionsHibernate interview questions
Hibernate interview questions
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 

Plus de reynolds

Three Thing In The Life
Three Thing In The LifeThree Thing In The Life
Three Thing In The Life
reynolds
 
Snake Catchers In Africa
Snake Catchers In AfricaSnake Catchers In Africa
Snake Catchers In Africa
reynolds
 
Tsunami Before & After
Tsunami Before & AfterTsunami Before & After
Tsunami Before & After
reynolds
 
Barack Obama
Barack ObamaBarack Obama
Barack Obama
reynolds
 
ObamaShirts
ObamaShirtsObamaShirts
ObamaShirts
reynolds
 
Obama+Presidential+Seal
Obama+Presidential+SealObama+Presidential+Seal
Obama+Presidential+Seal
reynolds
 
Barack Obama Phots Gallery
Barack Obama Phots GalleryBarack Obama Phots Gallery
Barack Obama Phots Gallery
reynolds
 
Barack Obama
Barack ObamaBarack Obama
Barack Obama
reynolds
 
Canstruction
CanstructionCanstruction
Canstruction
reynolds
 
Some Of The Beautiful Temples Of The World
Some Of The Beautiful Temples Of The WorldSome Of The Beautiful Temples Of The World
Some Of The Beautiful Temples Of The World
reynolds
 
Learn to live
Learn to liveLearn to live
Learn to live
reynolds
 
MANAGING RISK IN INTERNATIONAL BUSINESS
MANAGING RISK IN INTERNATIONAL BUSINESSMANAGING RISK IN INTERNATIONAL BUSINESS
MANAGING RISK IN INTERNATIONAL BUSINESS
reynolds
 
Artistic Airplanes
Artistic AirplanesArtistic Airplanes
Artistic Airplanes
reynolds
 
America The Beautiful
America The BeautifulAmerica The Beautiful
America The Beautiful
reynolds
 
Web 20 Business Models
Web 20 Business ModelsWeb 20 Business Models
Web 20 Business Models
reynolds
 
Fattest Athlete In The World
Fattest Athlete In The WorldFattest Athlete In The World
Fattest Athlete In The World
reynolds
 

Plus de reynolds (20)

Three Thing In The Life
Three Thing In The LifeThree Thing In The Life
Three Thing In The Life
 
Snake Catchers In Africa
Snake Catchers In AfricaSnake Catchers In Africa
Snake Catchers In Africa
 
Tsunami Before & After
Tsunami Before & AfterTsunami Before & After
Tsunami Before & After
 
Vote For The Barack Obama
Vote For The Barack ObamaVote For The Barack Obama
Vote For The Barack Obama
 
Barack Obama
Barack ObamaBarack Obama
Barack Obama
 
Vote For Change
Vote For ChangeVote For Change
Vote For Change
 
Barack Obama
Barack ObamaBarack Obama
Barack Obama
 
ObamaShirts
ObamaShirtsObamaShirts
ObamaShirts
 
Obama+Presidential+Seal
Obama+Presidential+SealObama+Presidential+Seal
Obama+Presidential+Seal
 
Barack Obama Phots Gallery
Barack Obama Phots GalleryBarack Obama Phots Gallery
Barack Obama Phots Gallery
 
Barack Obama
Barack ObamaBarack Obama
Barack Obama
 
Canstruction
CanstructionCanstruction
Canstruction
 
Some Of The Beautiful Temples Of The World
Some Of The Beautiful Temples Of The WorldSome Of The Beautiful Temples Of The World
Some Of The Beautiful Temples Of The World
 
Learn to live
Learn to liveLearn to live
Learn to live
 
MANAGING RISK IN INTERNATIONAL BUSINESS
MANAGING RISK IN INTERNATIONAL BUSINESSMANAGING RISK IN INTERNATIONAL BUSINESS
MANAGING RISK IN INTERNATIONAL BUSINESS
 
Artistic Airplanes
Artistic AirplanesArtistic Airplanes
Artistic Airplanes
 
America The Beautiful
America The BeautifulAmerica The Beautiful
America The Beautiful
 
Good Life
Good LifeGood Life
Good Life
 
Web 20 Business Models
Web 20 Business ModelsWeb 20 Business Models
Web 20 Business Models
 
Fattest Athlete In The World
Fattest Athlete In The WorldFattest Athlete In The World
Fattest Athlete In The World
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Dernier (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 

Flexiblerails

  • 1. Subscribe Now for FREE! refcardz.com tech facts at your fingertips CONTENTS INCLUDE: n About Flexible Rails Flexible Rails: Flex 3 on Rails 2 n Overview of Rails 2 n Overview of Flex 3 n Flex 3 and Rails 2 Together n Building a Flex + Rails Application By Peter Armstrong n Hot Tips and more... The typical sequence is as follows: ABOUT FLEXIBLE RAILS 1. A user visits a particular URL in their web browser (makes Simply put, Flex is the most productive way to build the UI an HTTP request). of Rich Internet Applications, and Rails is a very productive 2. This request goes over the Internet to the web server in way to rapidly build a database-backed CRUD application, which Rails is running. thanks to ActiveRecord (the ORM layer of Rails) and thanks 3. That web server passes the request to the routing code in to the principles of Convention Over Configuration and Rails, which triggers the appropriate controller method call DRY (Don’t Repeat Yourself). This refcard shows you how to based on the routes defined in configroutes.rb. get started. It provides an overview of Flex and Rails, how 4. The controller method is called. It communicates with they can be used together and then building a simple Flex various ActiveRecord models (which are persisted to and + Rails application using XML over HTTPService to have retrieved from a database of your choosing). The controller the Flex client talk to a RESTful Rails server. Since we’ll use method can then do one of two things: RESTful Rails controllers, the Rails controller methods will also support the traditional HTML views. 1. Set some instance variables and allow a view template (a specially named .html.erb file, for example) to be used to produce HTML, XML, or www.dzone.com OvERvIEw OF RAILS 2 JavaScript, which is sent to the browser. 2. Bypass the view mechanism and do rendering Rails provides a standard three-tier architecture (presentation tier, directly via a call to the render method. This method model tier, persistence tier) as well as a Model-View-Controller can produce plain text (render :text => quot;fooquot;), XML (MVC) architecture. As shown in Figure 1, Rails takes care of (render :text => @task), and so on. everything between the web server and the database. OvERvIEw OF FLEX 3 Web Browser Client In Flex 3, you write code in MXML (XML files with a .mxml extension; M for Macromedia) and ActionScript (text files with HTTP Request HTML http://www.pomodo.com/tasks/list XML Internet a .as extension) files and compile them into a SWF file, which JavaScript runs in the Flash player. This SWF is referenced by an HTML render :text, render :xml file, so that when a user with a modern web browser loads the HTML file, it plays the Flash movie (prompting the user Flexible Rails: Flex 3 on Rails 2 Rails to download Flash 9 if it’s not present). The SWF contained in Presentation the web page can interact with the web page it’s contained ActionController::Routing::Routes Tier in and with the server it was sent from. ActionController ActionView (Controller) (View) Get More Refcardz (They’re free!) ActiveRecord (Model) Model Tier n Authoritative content n Designed for developers n Written by top experts n Latest tools & technologies MySQL Persistence n Hot tips & examples PostgreSQL Tier n Bonus content online Oracle DB2, etc. n New issue every 1-2 weeks Figure 1: Rails provides a standard three-tier architecture (presenta- Subscribe Now for FREE! tion tier, model tier, persistence tier) as well as a Model-View-Controller Refcardz.com architecture. DZone, Inc. | www.dzone.com
  • 2. 2 Flexible Rails: Flex 3 on Rails 2 tech facts at your fingertips FLEX 3 AND RAILS 2 TOgEThER INSTALLINg EvERyThINg Flex and Rails can be used together with XML over HTTPService To get started, various software packages need to be installed. or with Action Message Format. The XML over HTTPService The full instructions can be found in chapter 2 of Flexible Rails approach is shown in Figure 2 below. (Manning Publications). Here’s what is needed: 1. Ruby 1.8.6 Web Browser with Flash Player 9 2. RubyGems 1.0.0 (or higher) Web Client 3. Rails. 2.0.2 (or higher) Flex app (SWF) Page 4. Flex Builder 3 render :text, render :xml 5. SQLite XML Internet 6. The sqlite3 gem, installed by running this command: HTTP Request http://www.pomodo.com/tasks/list C:>gem install sqlite3-ruby Presentation Resource URL Notes Rails Tier RubyonRails http://rubyonrails.org/down ActionController::Routing::Routes HiveLogic http://hivelogic.com/articles/2008/02/ ruby-rails-leopard SQLite http://www.sqlite.org/download.html On Windows, download ActionController ActionView sqlite-3_5_5.zip or higher (Controller) (View) and sqlitedll-3_5_5.zip or higher, and unzip both of them into C:WINDOWS Model Tier system32 ActiveRecord (Model) BUILDINg A FLEX + RAILS APPLICATION Persistence Tier The world doesn’t need Yet Another Todo List, but let’s build one. Unlike most Rails tutorials, we will assume you are using Windows. (Rails has “crossed the chasm”, so this is now becom- ing the correct assumption.) MySQL , PostgreSQL Open a command prompt or Terminal window and run the fol- Oracle, DB2, etc. lowing commands: Figure 2. C:>rails todo This installs the SQLite3 gem and then creates a new Rails appli- The AMF waters are a bit muddier: there are currently three cation which by default uses the SQLite database. (The default ways that Flex can talk to Rails using AMF and RemoteObject: in Rails 2.0.1 and below was MySQL.) n RubyAMF Next, create a couple of directories: n WebORB for Rails C:>cd todo n BlazeDS (with Rails running on JRuby). C:todo>mkdir appflex C:todo>mkdir publicbin Next, switch to Flex Builder 3 and create the new Flex project: Flash 9? Are you kidding me? 1. Do File > New > Flex Project... FYI The reference to Flash 9 earlier may have set off 2. Choose to create a new project named Todo in c:todo alarm bells in your head: “Isn’t Flash 9 somewhat 3. Leave its type set to “Web application” and its “Application new? How many people will be able to run my app?” Well, server type” set to None and click Next while not everyone has Flash 9, most do: according to http:// 4. Set the Output folder of the Flex project to publicbin and www.adobe.com/products/player_census/flashplayer/ click Next version_ penetration.html Flash 9 has reached near ubiquity: 5. Set the “Main source folder” to appflex, leave the “Main application file” as Todo.mxml and set the output folder 97.3% in US/Canada, 96.5% in Europe and 98.0% in Japan. to http://localhost:3000/bin and click Finish. Your new Flex This is better than Windows. project will be created. (Note that public isn’t part of the path since it’s the root; 3000 is the default port for the server). DZone, Inc. | www.dzone.com
  • 3. 3 Flexible Rails: Flex 3 on Rails 2 tech facts at your fingertips The TasksController (in appcontrollerstasks_controller.rb) We are using appflex as the root of all our looks like this: Hot Flex code—in larger team environments it’s class TasksController < ApplicationController Tip advisable to create a Flex project as a sibling # GET /tasks of the Rails app (say, c:todoclient) and set its output folder to go inside c:todopublic # GET /tasks.xml bin. This way, different team members can use def index different IDEs for the client and server projects: @tasks = Task.find(:all) for example, Aptana and Flex Builder are both respond_to do |format| Eclipse-based, and interesting things can format.html # index.html.erb happen when you nest projects. format.xml { render :xml => @tasks } end Building a Flex + Rails Application, continued end Next, let’s create a new Task resource using the now-RESTful # GET /tasks/1 scaffold command. # GET /tasks/1.xml C:todo>ruby scriptgenerate scaffold Task name:string def show Here we are creating a Task that has a name attribute, which @task = Task.find(params[:id]) is a string. Running this command generates the various Rails respond_to do |format| files, including the model, helper, controller, view templates, format.html # show.html.erb tests and database migration. We’re going to make the simplest format.xml { render :xml => @task } Todo list in history: Tasks have names, and nothing else. Further- end more, there are no users even, just a global list of tasks. end The Task model looks like this: # GET /tasks/new class Task < ActiveRecord::Base # GET /tasks/new.xml end def new Because the Task model extends (with <) ActiveRecord::Base, it @task = Task.new can be mapped to the equivalent database tables. Because we respond_to do |format| also created the controllers and views with the scriptgenerate format.html # new.html.erb scaffold command and ensured that we specified all the fields, format.xml { render :xml => @task } we can use a prebuilt web interface to Create, Read, Update, end and Delete (CRUD) them. end The CreateTasks migration that was created (in dbmigrate001_ # GET /tasks/1/edit create_tasks.rb) looks like this: def edit class CreateTasks < ActiveRecord::Migration @task = Task.find(params[:id]) def self.up end create_table :tasks do |t| # POST /tasks t.string :name t.timestamps # POST /tasks.xml end def create end @task = Task.new(params[:task]) def self.down respond_to do |format| drop_table :tasks if @task.save end flash[:notice] = 'Task was successfully created.' end format.html { redirect_to(@task) } CreateTasks Class Extends ActiveRecord::Migration format.xml { render :xml => @task, Up method Creates a new tasks table with the create_table method call, :status => :created, :location => @task } which takes a block that does the work else Down method Deletes it with the drop_table call format.html { render :action => quot;newquot; } In the up method, we specify the data types of each new format.xml { render :xml => @task.errors, column, such as string in our case, or boolean, integer or text. :status => :unprocessable_entity } These are then mapped to the equivalent database data types: end for example, boolean becomes a tinyint(1) in MySQL. The end timestamps call adds two columns: created_at and updated_ end at, which Rails treats specially, ensuring that they’re automatically # PUT /tasks/1 set. This is often a good thing to have, so we’ll leave them # PUT /tasks/1.xml there even though they won’t be needed in this build. → DZone, Inc. | www.dzone.com
  • 4. 4 Flexible Rails: Flex 3 on Rails 2 tech facts at your fingertips Building a Flex + Rails Application, continued What’s REST? def update FYI REST (Representational State Transfer) is a @task = Task.find(params[:id]) way of building web services that focuses on respond_to do |format| simplicity and an architecture style that is “of the web.” if @task.update_attributes(params[:task]) This can be described as a Resource Oriented Architecture flash[:notice] = 'Task was successfully updated.' format.html { redirect_to(@task) } (ROA); see RESTful Web Services published by O’Reilly Media format.xml { head :ok } for details. Briefly, the reason to use a RESTful design in Rails else is that it helps us organize our controllers better, forces format.html { render :action => quot;editquot; } us to think harder about our domain, and gives us a nice format.xml { render :xml => @task.errors, API for free. :status => :unprocessable_entity } end Next, we run the new migration that was created (CreateTasks) end when we ran the scaffold command: end C:todo>rake db:migrate # DELETE /tasks/1 At this point we run the server: # DELETE /tasks/1.xml def destroy C:todo>ruby scriptserver @task = Task.find(params[:id]) and play with creating, editing and deleting tasks. @task.destroy 1. Go to http://localhost:3000/tasks to see an empty task list. respond_to do |format| format.html { redirect_to(tasks_url) } 2. Click the New link to go to http://localhost:3000/tasks/new. format.xml { head :ok } 3. Create a new Task with a name of “drink coffee” and end click Create. end 4. Go back to http://localhost:3000/tasks to see the task list end with the new “drink coffee” task present. This new controller which was generated for us contains the Now, let’s do something interesting and hook this up to Flex. seven RESTful controller methods, which are explained in Currently, the Todo.mxml file looks like this: the following table (inspired by David Heinemeier Hansson’s <?xml version=quot;1.0quot; encoding=quot;utf-8quot;?> Discovering a World of Resources on Rails presentation— <mx:Application xmlns:mx=quot;http://www.adobe.com/ media.rubyonrails.org/presentations/worldofresources.pdf, 2006/mxmlquot; layout=quot;absolutequot;> slide 7—as well as the table on p. 410 of Agile Web Develop- ment with Rails, 2nd ed. (The Pragmatic Programmers), </mx:Application> and the tables in Geoffrey Grosenbach’s REST cheat sheet The top-level tag is mx:Application; the root of a Flex ap- http://topfunky.com/clients/peepcode/REST-cheatsheet.pdf): plication is always an Application. The mx: part identifies the XML namespace that the Application component is from. By # Method Sample Pretend Actual Corres- Corres- default, an Application uses an absolute layout, where you URL paths HTTP HTTP ponding ponding Method Method CRUD SQL specify the x,y of each top level container and component. Method Method What we want to build is the following application: 1 index /tasks GET GET READ SELECT /tasks.xml 2 show /tasks/1 GET GET READ SELECT /tasks/1.xml 3 new /tasks/new GET GET — — /tasks/new.xml 4 edit /tasks/1/edit GET GET READ SELECT 5 create /tasks POST POST CREATE INSERT /tasks.xml 6 update /tasks/1 PUT POST UPDATE UPDATE /tasks/1.xml 7 destroy /tasks/1 DELETE POST DELETE DELETE /tasks/1.xml Table 1: The seven standard RESTful controller methods Figure 3: The Simple Todo Flex Application DZone, Inc. | www.dzone.com
  • 5. 5 Flexible Rails: Flex 3 on Rails 2 tech facts at your fingertips Building a Flex + Rails Application, continued <mx:Panel title=quot;Simple Todoquot; width=quot;100%quot; We want the ability to create new tasks, delete tasks and rename height=quot;100%quot;> them inline in the list. Furthermore, we want to do this in the least <mx:HBox width=quot;100%quot; paddingLeft=quot;5quot; amount of code possible. Normally, I’d build this iteratively; but paddingRight=quot;5quot; we’ll build it all at once. Modify the Todo.mxml file to look like this: paddingTop=quot;5quot;> <?xml version=quot;1.0quot; encoding=quot;utf-8quot;?> <mx:Label text=quot;New Taskquot;/> <mx:Application <mx:TextInput id=quot;newTaskTIquot; width=quot;100%quot; xmlns:mx=quot;http://www.adobe.com/2006/mxmlquot; enter=quot;createTask()quot;/> width=quot;100%quot; height=quot;100%quot; layout=quot;verticalquot; <mx:Button label=quot;Createquot; click=quot;createTask()quot;/> backgroundGradientColors=quot;[#000000, #CCCCCC]quot; </mx:HBox> creationComplete=quot;svcTasksList.send()quot;> <mx:List id=quot;taskListquot; width=quot;100%quot; height=quot;100%quot; <mx:Script> editable=quot;truequot; labelField=quot;namequot; <![CDATA[ dataProvider=quot;{tasksXLC}quot; import mx.events.ListEvent; itemEditEnd=quot;updateSelectedTask(event)quot;/> import mx.controls.Alert; <mx:ControlBar width=quot;100%quot; horizontalAlign=quot;centerquot;> import mx.rpc.events.ResultEvent; <mx:Button label=quot;Deletequot; width=quot;100%quot; height=quot;30quot; private function createTask():void { enabled=quot;{taskList.selectedItem != null}quot; svcTasksCreate.send(); click=quot;deleteTask(XML(taskList.selectedItem))quot;/> } </mx:ControlBar> private function deleteTask(task:XML):void { </mx:Panel> svcTasksDestroy.url = quot;/tasks/quot; + task.id + quot;.xmlquot;; </mx:Application> svcTasksDestroy.send({_method: quot;DELETEquot;}); This is a complete Flex application in 67 lines of code! Compile } and run the application by clicking the green “play” button: you private function updateSelectedTask(event:ListEvent): will see the screen shown in Figure 3. void { var itemEditor:TextInput = A Quick Highlight Tour of this Code: TextInput(event.currentTarget.itemEditorInstance); var selectedTask:XML = XML(event.itemRenderer.data); 1 We use a vertical layout to make the components if (selectedTask.name == itemEditor.text) return; flow vertically. Other choices are horizontal (for horizontal flow) and absolute (which we saw before). The var params:Object = new Object(); backgroundGradientColors specify the start and end of the params['task[name]'] = itemEditor.text; gradient fill for the background. params['_method'] = quot;PUTquot;; svcTasksUpdate.url = quot;/tasks/quot;+ selectedTask.id +quot;.xmlquot;; svcTasksUpdate.send(params); We define a HTTPService svcTasksList, which does 2 } a GET to /tasks.xml (thus triggering the index action of private function listTasks():void { the TasksController) and specifies a resultFormat of e4x so svcTasksList.send(); the result of the service can be handled with the new E4X } XML API. We then take the lastResult of this service, which is an XML document, get its children (which is an XMLList ]]> of the tasks), and make this be the source of an XMLList- </mx:Script> Collection called tasksXLC. We do this with a binding to <mx:HTTPService id=quot;svcTasksCreatequot; url=quot;/tasks.xmlquot; the source attribute. Similarly, we define svcTasksCreate, contentType=quot;application/xmlquot; resultFormat=quot;e4xquot; svcTasksUpdate and svcTasksDestroy to be used for the method=quot;POSTquot; result=quot;listTasks()quot;> other CRUD operations. <mx:request> <task><name>{newTaskTI.text}</name></task> </mx:request> 3 We can pass data to Rails via data bindings using </mx:HTTPService> curly braces { } inside XML (as shown in svcTaskCreate) or by sending form parameters that Rails would be expecting <mx:HTTPService id=quot;svcTasksListquot; url=quot;/tasks.xmlquot; (as shown in the updateSelectedTask method). resultFormat=quot;e4xquot; method=quot;POSTquot;/> <mx:HTTPService id=quot;svcTasksUpdatequot; resultFormat=quot;e4xquot; method=quot;POSTquot; result=quot;listTasks()quot;/> 4 For svcTasksUpdate and svcTasksDestroy we are <mx:HTTPService id=quot;svcTasksDestroyquot; resultFormat=quot;e4xquot; not setting the url property statically, but instead method=quot;POSTquot; result=quot;listTasks()quot;/> dynamically setting it to include the id of the task we are <mx:XMLListCollection id=quot;tasksXLCquot; updating or destroying. source=quot;{XMLList(svcTasksList.lastResult.children())}quot;/> DZone, Inc. | www.dzone.com
  • 6. 6 Flexible Rails: Flex 3 on Rails 2 tech facts at your fingertips A hack: you can’t send HTTP PUT or DELETE from the RESOURCES 5 Flash player in a web browser, so we need to fake it. Luckily, since you can’t send PUT or DELETE from HTML in Organization URL Information a web browser either, Rails already has a hack in place—we Manning http://www.manning.com/armstrong Book: Flexible Rails—provides just need to know how to use it. Rails will look for a _method Publications a code-focused, iterative tutorial introduction to using parameter in its params hash and, if there is one, use it instead Flex with Rails. of the actual HTTP method. So, if we do a form POST with http://www.manning.com/armstrong2 Book: Enterprise Flexible a _method of PUT, Rails will pretend we sent an HTTP PUT. (If Rails—provides the definitive tutorial introduction to the you’re thinking that it’s ironic that at the core of a “cleaner” Ruboss Framework. architecture is a giant hack, well, you’re not alone.) This _meth- Ruboss http://www.ruboss.com The Ruboss Framework: The od can be added to a params Object (params['_method'] Technology Open Source Framework = quot;PUTquot;;) or to an anonymous object (svcTasksDestroy. Corporation Which Puts Flex On Rails. Ruboss taking the Flex + Rails send({_method: quot;DELETEquot;});) If you’re new to Flex, {} can combination further, making be used for both anonymous object creation and for data it even easier and more accessible to the Enterprise. continued from page 5of an anonymous object like a hash in Ruby. binding. Think ABOUT ThE AUThOR RECOMMENDED BOOK Peter Armstrong Flexible Rails is a book Peter Armstrong is the CEO and Co-Founder of Ruboss Technology Corporation about how to use Ruby (http://ruboss.com), a self-funded RIA startup in Vancouver, BC, Canada. Peter is on Rails and Adobe Flex also the co-creator of the open source Ruboss Framework, the RESTful way to develop to build next-generation Adobe Flex and AIR applications that easily int egrate with Ruby on Rails. Peter is rich Internet applications the author of Flexible Rails and Enterprise Flexible Rails. Peter has been developing (RIAs). The book takes you to the leading edge rich client applications for over 7 years. He has worked with Flex full-time since July of RIA development, 2004, including being a key part of the Dorado Product Engineering team that won the 2006 Adobe presenting examples in MAX Award for RIA/Web Development ( http://my.adobe.acrobat.com/doradomaxpresentation/). Flex 3 and Rails 2. He is the organizer of The Vancouver Ruby/Rails Meetup group and is a frequent conference speaker on using Flex and Rails together. BUy NOw Blog books.dzone.com/books/flexible-rails http://peterarmstrong.com/ Want More? Download Now. Subscribe at refcardz.com Upcoming Refcardz: Available: n C# Published June 2008 FREE n GlassFish Application Server n jQuerySelectors n RSS and Atom n Design Patterns n Apache Struts 2 Published May 2008 n Dependency Injection in EJB 3 n MS Silverlight 2 Windows NetBeans IDE 6 Java Editor Published April 2008 PowerShell n Spring Configuration GWT Style, n Published May 2008 Groovy Configuration n Getting Started with Eclipse and JSNI Reference n Getting Started with Ajax Published April 2008 n DZone, Inc. 1251 NW Maynard ISBN-13: 978-1-934238-08-0 Cary, NC 27513 ISBN-10: 1-934238-08-2 50795 888.678.0399 DZone communities deliver over 3.5 million pages per month to 919.678.0300 more than 1.5 million software developers, architects and designers. Refcardz Feedback Welcome DZone offers something for every developer, including news, refcardz@dzone.com $7.95 tutorials, blogs, cheatsheets, feature articles, source code and more. Sponsorship Opportunities 9 781934 238080 “DZone is a developer’s dream,” says PC Magazine. sales@dzone.com Copyright © 2008 DZone, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by means electronic, mechanical, Version 1.0 photocopying, or otherwise, without prior written permission of the publisher. Reference: Flexible Rails: Flex 3 on Rails 2, Peter Armstrong. Manning Publications, 2008.