<?xml version="1.0" encoding="UTF-8"?>
<cast-nodes type="array">
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>&lt;h2&gt;Welcome to the Learning Rails Online Course&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;ve read this far, you probably already have an interest in building web applications with Ruby on Rails. But just in case you&amp;#8217;re unsure if Rails is worth learning, in this lesson we explore the reasons for the success of Ruby on Rails and the benefits that can result from using it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;p&gt;To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;h2&gt;Web resources&lt;/h2&gt;
&lt;p&gt;Keep in mind the distinction between Ruby and Ruby on Rails:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Ruby is a programming language&lt;/li&gt;
	&lt;li&gt;Ruby on Rails (often called simply &amp;#8220;Rails&amp;#8221;) is a framework for building web applications with Ruby&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The central web resources for Ruby and Rails, respectively, are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.ruby-lang.org&quot;&gt;Ruby Language&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.rubyonrails.com&quot;&gt;Ruby on Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to do some more preparation for your Ruby on Rails
education, we highly recommend that you begin learning Ruby, the
programming language, without regard to Rails (at first). You don&amp;#8217;t
need an extensive knowledge of Ruby, but you need to learn the
basics. We&amp;#8217;ll talk about Ruby a little more in later lessons, but
you can get started now learning it on your own.&lt;/p&gt;
&lt;p&gt;If you have experience with another programming language, much of
Ruby will seem very natural. If you don&amp;#8217;t have any experience with
object-oriented programming, you may want to read up on Ruby
objects &amp;#8212; in Ruby, everything is an object, and you&amp;#8217;ll work with
them constantly.&lt;/p&gt;
&lt;p&gt;Ruby uses one unusual construct, the code block, which is
unfamiliar to most programmers and merits some study. Code blocks
are used extensively in Rails.&lt;/p&gt;
&lt;p&gt;Ruby-lang.org has a &lt;a href=&quot;http://www.ruby-lang.org/en/documentation/quickstart/&quot;&gt;good introductory tutorial&lt;/a&gt; and a &lt;a href=&quot;http://www.ruby-doc.org/docs/ruby-doc-bundle/Tutorial/&quot;&gt;longer introduction to Ruby&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.techotopia.com/index.php/Ruby_Essentials&quot;&gt;Ruby Essentials&lt;/a&gt; is a short online ebook on ruby.&lt;/p&gt;
&lt;p&gt;And for those of you who are more graphically inclined, check out &lt;a href=&quot;http://poignantguide.net/ruby/chapter-3.html&quot;&gt;Why&amp;#8217;s Poignant Guide to Ruby, Chapter 3&lt;/a&gt;, it even has foxes!&lt;/p&gt;
&lt;p&gt;You can begin experimenting with Ruby right in your browser, without having to install anything. Just browse to &lt;a href=&quot;http://tryruby.hobix.com/&quot;&gt;tryruby.hobix.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Introductory books&lt;/h2&gt;
&lt;p&gt;You need to learn about both Ruby and Rails, and you&amp;#8217;ll want separate books for each of them.&lt;/p&gt;
&lt;p&gt;For beginning Ruby, these are both good introductory books:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0596529864/buildicom-20&quot;&gt;Learning Ruby&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590597664/buildicom-20&quot;&gt;Beginning Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are several other valuable references and advanced guides for Ruby, which you&amp;#8217;ll want to pick up if you get serious about your Ruby programming; see &lt;a href=&quot;/books/list?category=6&quot;&gt;our Ruby bookstore&lt;/a&gt; for an extensive list.&lt;/p&gt;
&lt;p&gt;For learning Ruby on Rails, the current selection of books is a little problematic. Two years ago, there were only a few books; now there are dozens, which makes it more confusing to pick one. And alas, most of them are written for Rails 1.2.6, and the ones that are the most up-to-date are not well suited for beginners.&lt;/p&gt;
&lt;p&gt;Although it is not the most accessible book for a novice programmer, and is written for Rails 1.2.x, &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0977616630/buildicom-20&quot;&gt;Agile Web Development with Rails&lt;/a&gt; remains the classic Rails book. But if you&amp;#8217;re using Rails 2, which we recommend you do, parts of this book will be confusing due to changes in the framework.&lt;/p&gt;
&lt;p&gt;The most up-to-date and in-depth book on Ruby on Rails is &lt;strong&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0321445619/buildicom-20&quot;&gt;The Rails Way&lt;/a&gt;&lt;/strong&gt;. It isn&amp;#8217;t written as an introductory book, so while we highly recommend it as a reference, you&amp;#8217;ll probably want to start with another book to get your bearings first. The Agile book mentioned above is a good place to start, especially if you have a programming background. If you&amp;#8217;re looking for a gentler introduction, some of the available books include:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590597524/buildicom-20&quot;&gt;Rails Solutions: Ruby on Rails Made Easy&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0975841955/buildicom-20&quot;&gt;Build Your Own Ruby on Rails Web Applications&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590596862/buildicom-20&quot;&gt;Beginning Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other books provide a lot of example code that provide useful guides for how to implement various features. Books of this type include:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590598415/buildicom-20&quot;&gt;Practical Rails Social Networking Sites&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0321480791/buildicom-20&quot;&gt;RailsSpace: Building a Social Networking Website with Ruby on Rails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590597362/buildicom-20&quot;&gt;Beginning Ruby on Rails E-Commerce&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0596527314/buildicom-20&quot;&gt;Rails Cookbook&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0977616606/buildicom-20&quot;&gt;Rails Recipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See our &lt;a href=&quot;/books/list?category=5&quot;&gt;complete list of Ruby and Ruby on Rails Books&lt;/a&gt; for more.&lt;/p&gt;</aux>
    <body>Ruby on Rails is one of the fastest-growing web development platforms. In this inaugural Learning Rails podcast, we explain what Ruby and Rails are, the huge &quot;sweet spot&quot; for Rails applications, and why it is worth investing your time to learn the platform.</body>
    <created-at type="datetime">2008-07-24T01:00:49-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">1</historic-id>
    <id type="integer">6514</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Why You Should Learn Ruby on Rails</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2007-11-25T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">1</status>
    <updated-at type="datetime">2009-03-19T11:32:05-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-1.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Examples used in the audio program&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s some of the examples we use in the show, which may be easier to grasp in printed form:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;If the user types www.BuildingWebApps.com/podcast.html into their browser, they&amp;#8217;re asking the server at BuildingWebApps.com to find a file called podcast.html and send the contents of that file to the browser.&lt;/li&gt;
	&lt;li&gt;In a Rails application, the request would be written as www.BuildingWebApps.com/podcast, in which podcast is the name of the controller to be invoked&lt;/li&gt;
	&lt;li&gt;A Rails &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; such as www.BuildingWebApps.com/podcast/show/17 invokes the show action in the podcast controller and passes it the parameter of 17 (presumably the ID for a podcast episode).&lt;/li&gt;
	&lt;li&gt;To request all the podcast objects, the controller would execute a statement such as &lt;code&gt;podcasts = Podcast.find(:all)&lt;/code&gt;. (Don&amp;#8217;t worry about the odd punctuation for now.&lt;/li&gt;
	&lt;li&gt;To find a particular podcast episode according to its episode number, the show action might execute a statement such as &lt;code&gt;podcast = Podcast.find_by_episode(2)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;For More Information&lt;/h2&gt;
&lt;p&gt;See the notes for &lt;a href=&quot;/podcasts/show_notes/1&quot;&gt;Lesson 1&lt;/a&gt; for pointers to online resources and books about Ruby and Ruby on Rails.</aux>
    <body>In this episode, we look at just what happens when a user enters a URL in their browser, and how this is translated into a request for a specific file in a static site or a typical PHP site. In a Rails application, it instead becomes a request to execute a particular action in a particular controller, which will use model objects to request data from the database and then pass that information, in the form of a variable, to the view, where it will be rendered into a page.</body>
    <created-at type="datetime">2008-07-24T01:00:50-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">3</historic-id>
    <id type="integer">6554</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Anatomy of a Web Application</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2007-12-09T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">2</status>
    <updated-at type="datetime">2009-03-19T11:32:05-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-2.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>&lt;p&gt;To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Code Examples&lt;/h2&gt;
&lt;p&gt;In this podcast, we mention several bits of code that are hard to visualize in audio, so we&amp;#8217;ve included them here. Refer to the &lt;a href=&quot;/podcasts/4/transcript&quot;&gt;transcript&lt;/a&gt; to see these examples in context.&lt;/p&gt;
&lt;p&gt;For links to additional resources, scroll down past the code examples.&lt;/p&gt;
&lt;h3&gt;Embedded Ruby&lt;/h3&gt;
&lt;p&gt;Ruby code in a view template is preceded by &lt;code&gt;&amp;lt;%&lt;/code&gt; and followed by &lt;code&gt;%&amp;gt;&lt;/code&gt;. The enclosed text is what is called &amp;#8220;embedded Ruby,&amp;#8221; or ERb.&lt;/p&gt;
&lt;p&gt;If the Ruby code is preceded by just &lt;code&gt;&amp;lt;%&lt;/code&gt;, then the code is executed, but its output is not inserted into the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; stream. For example, you might have Ruby code that says something like &amp;#8220;if podcast title is not blank&amp;#8221;. In real code, this would be:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% if !podcast.title.blank? %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;For example, if we had a variable named title and we wanted its value to be inserted into the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, we&amp;#8217;d write&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= title %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Last episode, we gave as an example a page listing all the episodes of this podcast. In this example, the variable that would be passed to the view would be an array of podcast objects.&lt;/p&gt;
&lt;p&gt;The code to do so looks like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% for podcast in podcasts %&amp;gt;
    &amp;lt;h2&amp;gt;&amp;lt;%= podcast.title %&amp;gt;&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;%= podcast.description %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Partials&lt;/h3&gt;
&lt;p&gt;A partial is just a small view template that is meant to be included in another template, or in a layout. The statement that goes in the controller is:&lt;/p&gt;
&lt;pre&gt;
render :partial =&amp;gt; 'partial_name'
&lt;/pre&gt;
&lt;p&gt;You can also use a partial when you want to repeatedly insert the same bit of markup, but using data from a series of objects. For example, consider our listing of podcast episodes. We can use a partial that displays the information for a single podcast. You could simply put that partial in a loop that executes it once for each podcast object, like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% for podcast in podcasts %&amp;gt;
    &amp;lt;%= render :partial =&amp;gt; 'podcast' %&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;(For simplicity, we&amp;#8217;re ignoring here some details about how the podcast variable is passed to the partial.)&lt;/p&gt;
&lt;p&gt;But Rails gives us a shortcut that makes this even simpler; in the &amp;#8220;render partial&amp;#8221; statement, we can refer to the array of podcast objects (which the controller provided), and the partial will automatically be repeated for each podcast in the array. Here&amp;#8217;s the code:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= render :partial =&amp;gt; 'podcast', :collection =&amp;gt; podcasts %&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Rails Helpers&lt;/h3&gt;
&lt;p&gt;Instead of writing:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;a href = 'some_URL'&amp;gt;Text to be linked&amp;lt;/a&amp;gt;
&lt;/pre&gt;
&lt;p&gt;you can use the Rails link_to helper, like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= link_to 'Text to be linked', 'some_URL' %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The link_to helper is more interesting when you use it to help you generate the &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, instead of specifying it explicitly. For example, you can specify the controller and action you want the link to invoke, and any parameters that you want to pass to it, and let link_to generate the &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;. Dynamic generation of links is really preferable when it comes to flexibility and maintenance of your code. For example, you could write:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= link_to 'View Transcript', 
    :controller =&amp;gt; 'podcast', 
    :action =&amp;gt; 'view_transcript', 
    :id =&amp;gt; podcast %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Another common helper is image_tag. Instead of the usual&lt;/p&gt;
&lt;pre&gt;
&amp;lt;img src = '/images/filename'&amp;gt;
&lt;/pre&gt;
&lt;p&gt;you can write Ruby code that reads&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= image_tag 'filename' %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Rails assumes, by default, that all images are in a directory called images, so you don&amp;#8217;t need to include the directory as part of the filename. You can also add additional parameters, such as alt text and image dimensions, using Ruby instead of &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; code, such as:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= image_tag 'filename', 
    :alt =&amp;gt; 'Alt text goes here', 
    :height =&amp;gt; 50, :width =&amp;gt; 125 %&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;DHTML&lt;/span&gt; with Rails&lt;/h3&gt;
&lt;p&gt;Here&amp;#8217;s a simplified version of the code to observe the shipping adddress checkbox and call as JavaScript function when it is checked:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= observe_field 'shipping_address', 
    :function =&amp;gt; 'show_shipping_address();' %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;(We haven&amp;#8217;t shown here the code that defines the JavaScript function show_shipping_address(), which you could write in conventional JavaScript.)&lt;/p&gt;
&lt;p&gt;With &lt;span class=&quot;caps&quot;&gt;RJS&lt;/span&gt; (Ruby JavaScript), you can write something like:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= observe_field 'shipping_address', 
    :function =&amp;gt; update_page {|page| page[:shipping_address].show} %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;There&amp;#8217;s a bit of Ruby syntax there that we haven&amp;#8217;t explained, but hopefully you get the idea. We&amp;#8217;ve also ignored, for simplicity, the need to hide the shipping address if the box is unchecked.&lt;/p&gt;
&lt;h3&gt;Ajax with Rails&lt;/h3&gt;
&lt;p&gt;Here&amp;#8217;s the observe_field statement that makes an Ajax call to the server to get the address:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;%= observe_field 'address_chooser',
    :update =&amp;gt; 'shipping_address',
    :url =&amp;gt; {:controller =&amp;gt; 'user', :action =&amp;gt; 'get_address'},
    :with =&amp;gt; 'address_chooser' %&amp;gt;
&lt;/pre&gt;
&lt;h2&gt;Resources for Further Learning&lt;/h2&gt;
&lt;p&gt;See the &lt;a href=&quot;/learningrails/1&quot;&gt;Lesson Page for lesson 1&lt;/a&gt; for links to Ruby and Rails books and other  resources.&lt;/p&gt;
&lt;p&gt;If you want to get deep into the Ajax aspects of Rails, there&amp;#8217;s one book devoted to that subject: &lt;a href=&quot;http://www.amazon.com/gp/product/0596527446?ie=UTF8&amp;amp;tag=buildicom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596529864&quot;&gt;Ajax on Rails&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To learn more about the JavaScript frameworks included in Rails, visit their sites:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://prototypejs.org&quot;&gt;Prototype&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://script.aculo.us/&quot;&gt;Scriptaculous&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</aux>
    <body>Rails creates web pages through a combination of layouts, templates, and partials. We'll explore how they work together to create a powerful mechanism for laying out web pages. We'll also touch on the Ajax support that is built in to Rails.</body>
    <created-at type="datetime">2008-07-24T01:00:50-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">4</historic-id>
    <id type="integer">6568</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Rails Views -- How Rails Renders Pages</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2007-12-23T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">3</status>
    <updated-at type="datetime">2009-03-19T11:32:05-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-3.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Resources for Further Study&lt;/h2&gt;
&lt;p&gt;Any Ruby on Rails book will explain how migrations, models, and associations work. The classic Agile Web Development with Rails does a good job explaining them.&lt;/p&gt;
&lt;p&gt;Note that Rails 2.0 provides a slightly simpler syntax for migrations, which we&amp;#8217;ve used in our examples, so in most books you&amp;#8217;ll see the Rails 1.2 style.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/UnderstandingMigrations&quot;&gt;Rails wiki&lt;/a&gt; has an explanation of migrations, but as of this writing it has not been updated for Rails 2.0. The &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Migration.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; document&lt;/a&gt; provides a less readable but more complete and up-to-date description.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a &lt;a href=&quot;http://www.netbeans.org/kb/60/ruby/model.html&quot;&gt;hand-on tutorial using NetBeans 6.0&lt;/a&gt; that shows how to create migrations and models using the NetBeans &lt;span class=&quot;caps&quot;&gt;IDE&lt;/span&gt;.&lt;/p&gt;
&lt;h2&gt;Code Examples&lt;/h2&gt;
&lt;p&gt;The user requirements for the example we discuss in this podcast are:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;A visitor to the site sees a list of podcasts with their title, description, and a link to an MP3 file&lt;/li&gt;
	&lt;li&gt;If there is an associated show note for that podcast, a link appears that goes to a page displaying it.&lt;/li&gt;
	&lt;li&gt;Each podcast is tagged with one or more topic categories which the visitor can see next to the podcast&amp;#8217;s other information&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&amp;#8217;s a schematic drawing of the required objects:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/LR_episode_4.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The migration that creates the podcast database table reads something like this:&lt;/p&gt;
&lt;pre&gt;
create_table &quot;podcasts&quot; do |t|
    t.string &quot;title&quot;
    t.string &quot;description&quot;
    t.string &quot;filename&quot;
end
&lt;/pre&gt;
&lt;p&gt;The create_table line begins a code block that defines the table. This line provides the shortcut name t, which is referenced in the lines that define the table.&lt;/p&gt;
&lt;p&gt;To create a new podcast object, you use a very simple Podcast class and simply type:&lt;/p&gt;
&lt;pre&gt;
episode = Podcast.new
&lt;/pre&gt;
&lt;p&gt;And now you have an instance of the Podcast class, which you&amp;#8217;ve named episode. Now, to set its attributes, you can simply write:&lt;/p&gt;
&lt;pre&gt;
episode.title = &quot;Learning Ruby on Rails&quot;
episode.filename = &quot;learningrails-1.mp3&quot;
episode.description = &quot;This episode covers...&quot;
&lt;/pre&gt;
&lt;p&gt;When this code is executed, you&amp;#8217;ve created the episode object and filled it with data. Now it takes one more line of code, &lt;code&gt;episode.save&lt;/code&gt;, to write the data to the database.&lt;/p&gt;
&lt;p&gt;To find an episode by name, you can simply write:&lt;/p&gt;
&lt;pre&gt;
episode = Podcast.find_by_title('Learning Ruby on Rails')
&lt;/pre&gt;
&lt;p&gt;and you&amp;#8217;ll get back a podcast object, called episode, with all the information about that podcast.&lt;/p&gt;
&lt;p&gt;What about the show notes? We need another migration to define that table, the core of which is simply:&lt;/p&gt;
&lt;pre&gt;
t.text &quot;body&quot;
t.integer &quot;podcast_id&quot;
&lt;/pre&gt;
&lt;p&gt;The body field is where we store the text of the show notes. (The column type of &amp;#8220;text&amp;#8221; instead of &amp;#8220;string&amp;#8221; tells the database to allow a potentially large amount of text.)&lt;/p&gt;
&lt;p&gt;The podcast_id field is how Rails knows what podcast a particular show_notes object is associated with.&lt;/p&gt;
&lt;p&gt;To set up the association, you add one line of code to each of the associated models&amp;#8217; classes. The podcast class gets a line that reads:&lt;/p&gt;
&lt;pre&gt;
has_one :show_notes
&lt;/pre&gt;
&lt;p&gt;and the show_notes model gets a line that reads:&lt;/p&gt;
&lt;pre&gt;
belongs_to :podcast
&lt;/pre&gt;
&lt;p&gt;With these two simple additions, you can now write episode.show_notes to access the show notes for a particular episode.&lt;/p&gt;
&lt;p&gt;To associate podcasts with categories, we need a join table, whose field definitions are:&lt;/p&gt;
&lt;pre&gt;
t.integer podcast_id
t.integer category_id
&lt;/pre&gt;
&lt;p&gt;With the join table created and the &lt;span class=&quot;caps&quot;&gt;HABTM&lt;/span&gt; declarations in the two model files, you can simply write&lt;/p&gt;
&lt;pre&gt;
episode.categories
&lt;/pre&gt;
&lt;p&gt;and you&amp;#8217;ll get back an array of category objects, one for each category that is associated with that particular episode.</aux>
    <body>Rails provides an elegant set of tools for creating your database and accessing it. Migrations are simple Ruby files that let you create your database tables without SQL. You access the database through the model objects you create, which inherit a rich set of capabilities from Active Record. You can define associations between models that enable you to easily access related data that is spread across multiple tables.</body>
    <created-at type="datetime">2008-07-24T01:00:50-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">5</historic-id>
    <id type="integer">6588</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">4</lock-version>
    <name>Rails Models</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2008-01-06T00:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">4</status>
    <updated-at type="datetime">2009-09-05T18:30:56-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-4.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Lesson Notes&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;CRUD&lt;/span&gt; is the acronym for the four main things you do with database records:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Create&lt;/li&gt;
	&lt;li&gt;Read&lt;/li&gt;
	&lt;li&gt;Update&lt;/li&gt;
	&lt;li&gt;Delete&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These notes illustrate the code described in the podcast. See the transcript for more details.&lt;/p&gt;
&lt;p&gt;For more details about forms processing with Rails, see the &lt;a href=&quot;/topic/11&quot;&gt;forms&lt;/a&gt; page in our topics section. You&amp;#8217;ll find some great screencasts listed there that will go into much more depth than this podcast.&lt;/p&gt;
&lt;p&gt;For a database of podcast episodes, with a title and a description field for each, the basic form code looks like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% form_for @podcast do |form| %&amp;gt;
    &amp;lt;%= form.text_field :title %&amp;gt;
    &amp;lt;%= form.text_area :description %&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The minimal code for the controller&amp;#8217;s create action is:&lt;/p&gt;
&lt;pre&gt;
Podcast.create params[:podcast]
&lt;/pre&gt;
&lt;p&gt;The create method takes the parameters from the params[:podcast] hash, uses them to initialize a new object, and then saves that object to the database.&lt;/p&gt;
&lt;p&gt;This line to the podcast model ensures that podcasts can&amp;#8217;t be saved with a blank title:&lt;/p&gt;
&lt;pre&gt;
validates_presence_of :title
&lt;/pre&gt;
&lt;p&gt;In the controller, the create action tests the value returned from the Podcast.create call, and if it is not false, it knows the save succeeded. If it is false, then the form is rendered again.&lt;/p&gt;
&lt;pre&gt;
if Podcast.create params[:podcast]
    redirect_to (wherever you want to go after a successful save)
else
    render :action =&amp;gt; :new
end
&lt;/pre&gt;
&lt;p&gt;To display the error messages, the form view just includes a call to the error_messages_for helper:&lt;/p&gt;
&lt;pre&gt;
error_messages_for :podcast
&lt;/pre&gt;
&lt;p&gt;To make this an Ajax form, we can simply change the form_for helper to remote_form_for:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% remote_form_for @podcast do |form| %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The rest of the form remains the same. The controller and views must be modified to return just an &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; or JavaScript snipped, rather than an entire page, after a create or update action.</aux>
    <body>Ruby on Rails provides a variety of facilities to simplify the use of forms to enter and update database information, which is one of the most common tasks for any web application. These include form helpers, which generate the HTML code for the form, validation methods for use in model classes that make it easy to check entered information for errors, and helpers to display those errors. We'll describe how all these features work together.</body>
    <created-at type="datetime">2008-07-24T01:00:51-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">6</historic-id>
    <id type="integer">6601</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Rails Form Processing</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2008-01-20T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">5</status>
    <updated-at type="datetime">2009-03-19T11:32:05-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-5.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>&lt;p&gt;To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Lesson Notes&lt;/h2&gt;
&lt;p&gt;For links to more information about the various tools mentioned in this lesson, refer to following parts of the BuildingWebApps site:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/26-integrated-development-environments-ides&quot;&gt;IDEs&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/172-editors&quot;&gt;Editors&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/77-gems-and-libraries&quot;&gt;Gems&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/174-automation&quot;&gt;Automation&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/71-plugins&quot;&gt;Plugins&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/125-version-control&quot;&gt;Source Code (Version) Control&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/153-capistrano&quot;&gt;Deployment&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/183-ri-and-rdoc&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/200-logging-services&quot;&gt;Logging&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/111-debugging&quot;&gt;Debugging&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/56-testing&quot;&gt;Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</aux>
    <body>The Ruby on Rails approach to application development goes beyond just your code itself; there's a variety of tools and practices that are a nearly integral part of it. These include keeping all your source code in a version control system (typically Subversion); the Rake automation tool; ri and rdoc documentation tools; and the Capistrano deployment tool; logging facilities; and the ruby-debug debugger.</body>
    <created-at type="datetime">2008-07-24T01:00:51-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">7</historic-id>
    <id type="integer">6606</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Tools for Rails Developers</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2008-02-03T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">6</status>
    <updated-at type="datetime">2009-03-19T11:32:05-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-6.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>&lt;p&gt;To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The heart of the lesson is the audio&lt;/strong&gt;; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Code Examples&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s an example of using asserts. Suppose you have a test that searches for a non-existent podcast episode; you&amp;#8217;d want to assert that the result was nil. The test case code would read:&lt;/p&gt;
&lt;pre&gt;
def test_podcast_does_not_exist
  podcast = Podcast.find_by_title('Intro')
  assert_nil podcast
end
&lt;/pre&gt;
&lt;p&gt;Another example checking to see if the test database contains three podcasts loaded from fixtures might read:&lt;/p&gt;
&lt;pre&gt;
def test_three_podcasts_exist
  assert_equal, Podcast.find(:all), 3
end
&lt;/pre&gt;
&lt;p&gt;Here&amp;#8217;s an example of a fixture, illustrating how fixtures can use model associations. An entry in the podcast.yml file might read:&lt;/p&gt;
&lt;pre&gt;
episodeone:
  name: Introductory Podcast
  listeners: anne, bob, charlie
&lt;/pre&gt;
&lt;p&gt;and entries in the listeners.yml file would read:&lt;/p&gt;
&lt;pre&gt;
anne:
  name: Anne
  podcast: episodeone

bob:
  name: Bob 
  podcast: episodeone

charlie:
  name: Charlie
  podcast: episodeone
&lt;/pre&gt;
&lt;h2&gt;Links to More Resources&lt;/h2&gt;
&lt;p&gt;See the following sections of the site for links to resources on testing:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/56-testing&quot;&gt;Testing in general&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/106-test-driven-development-tdd&quot;&gt;Test-driven development&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/57-unit-testing&quot;&gt;Unit testing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/58-functional-testing&quot;&gt;Functional testing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/59-integration-testing&quot;&gt;Integration testing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/241-fixtures&quot;&gt;Test fixtures&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/190-tools&quot;&gt;Testing Toolsl&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/topic/102-behavior-driven-development-bdd&quot;&gt;Behavior-Driven Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</aux>
    <body>Ruby on Rails incorporates tools that facilitate best practices when it comes to testing your code. Whether you leverage the built-in Test::Unit framework or add one of many more advanced testing tools, you can begin to build a &quot;quality safety net&quot; through a collection of unit, functional, and integration tests. We'll walk through how to get started writing and using tests, touch on some testing methodologies such as TDD and BDD, and get you familiar with the tools that will help maintain the quality of your application.</body>
    <created-at type="datetime">2008-07-24T01:00:51-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">8</historic-id>
    <id type="integer">6609</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Testing Rails Code</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2008-02-17T16:00:00-08:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">7</status>
    <updated-at type="datetime">2009-03-19T11:32:06-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-7.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
  <cast-node>
    <account-id type="integer">2</account-id>
    <author>Michael Slater and Christopher Haupt</author>
    <aux>&lt;p&gt;To listen to the lesson, click the Play button on the left. You can also right-click on the download link to save the mp3 file, or you can subscribe in iTunes (just search for Learning Rails).&lt;/p&gt;
&lt;p&gt;To read a transcript of the lesson, click the Transcript link on the left.&lt;/p&gt;
&lt;p&gt;The heart of the lesson is the audio; these notes are supplementary. So please listen to the audio, or read the transcript, before making use of these notes.&lt;/p&gt;
&lt;h2&gt;Detailed Ruby on Rails Development Environment Installation Instructions&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;/articles/17-setting-up-rails-on-leopard-mac&quot;&gt;Mac OS X 10.5 Leopard&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/articles/18-setting-up-rails-on-tiger-mac&quot;&gt;Mac OS X 10.4 Tiger&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/articles/20-setting-up-rails-on-windows-vista&quot;&gt;Windows Vista&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;/articles/19-setting-up-rails-on-windows-xp&quot;&gt;Windows XP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</aux>
    <body>Having made it this far in our series, you should have a good overview of the core concepts used in Ruby on Rails. The next step is to start building something! We're going to lead you through that too, with our upcoming screencasts. For you to follow along, you're going to need a development environment set up on your computer, and in this podcast we discuss the steps in doing so.</body>
    <created-at type="datetime">2008-07-24T01:00:51-07:00</created-at>
    <created-by type="integer">1</created-by>
    <dy-schema-id type="integer" nil="true"></dy-schema-id>
    <dy-schema-type nil="true"></dy-schema-type>
    <filter-id nil="true"></filter-id>
    <flags type="integer">0</flags>
    <historic-id type="integer">9</historic-id>
    <id type="integer">6611</id>
    <kind-id type="integer">5027</kind-id>
    <lock-version type="integer">2</lock-version>
    <name>Setting Up Your Development Environment</name>
    <owner-id type="integer" nil="true"></owner-id>
    <owner-type nil="true"></owner-type>
    <published-at type="datetime">2008-03-25T17:00:00-07:00</published-at>
    <rating type="integer">0</rating>
    <ref-count type="integer">0</ref-count>
    <sequence type="integer">0</sequence>
    <status type="integer">8</status>
    <updated-at type="datetime">2009-03-19T11:32:06-07:00</updated-at>
    <updated-by type="integer">1</updated-by>
    <url>http://www.buildingwebapps.com/account_assets/bwa/assets/learningrails-8.mp3</url>
    <user-id type="integer">1</user-id>
    <version type="integer">0</version>
    <workflow-task-status-id type="integer" nil="true"></workflow-task-status-id>
  </cast-node>
</cast-nodes>
