<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serabe Reloaded &#187; Ruby on Rails</title>
	<atom:link href="http://www.serabe.com/category/programacion/ruby/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.serabe.com</link>
	<description>Conecto ergo sum. Non conecto ergo urgueo.</description>
	<lastBuildDate>Wed, 14 Jul 2010 18:12:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Anidamiento de recursos con REST en Ruby on Rails Ã³ cÃ³mo acceder de dos maneras distintas a un mismo controlador utilizando REST con Ruby On Rails.</title>
		<link>http://www.serabe.com/2007/09/03/anidamiento-de-recursos-con-rest-en-ruby-on-rails-o-como-acceder-de-dos-maneras-distintas-a-un-mismo-controlador-utilizando-rest-con-ruby-on-rails/</link>
		<comments>http://www.serabe.com/2007/09/03/anidamiento-de-recursos-con-rest-en-ruby-on-rails-o-como-acceder-de-dos-maneras-distintas-a-un-mismo-controlador-utilizando-rest-con-ruby-on-rails/#comments</comments>
		<pubDate>Mon, 03 Sep 2007 21:37:34 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.serabe.com/2007/09/03/anidamiento-de-recursos-con-rest-en-ruby-on-rails-o-como-acceder-de-dos-maneras-distintas-a-un-mismo-controlador-utilizando-rest-con-ruby-on-rails/</guid>
		<description><![CDATA[DespuÃ©s de un tÃ­tulo tan largo, lo primero es meter en situaciÃ³n. Tengo una web que tiene temas, en cada tema hay mÃ¡s temas y descargas. Estos se muestran con los controladores topics y downloads respectivamente. El problema venÃ­a puesto que los controladores se tenÃ­an que poder acceder de dos formas. En el caso de [...]]]></description>
			<content:encoded><![CDATA[<p>DespuÃ©s de un tÃ­tulo tan largo, lo primero es meter en situaciÃ³n. Tengo una web que tiene temas, en cada tema hay mÃ¡s temas y descargas. Estos se muestran con los controladores <em>topics</em> y <em>downloads</em> respectivamente. El problema venÃ­a puesto que los controladores se tenÃ­an que poder acceder de dos formas. En el caso de las descargas:</p>
<p><strong>1.-</strong> /<em>downloads</em><br />
<strong>2.-</strong> /<em>topics</em>/<strong>:topic_id</strong>/<em>downloads</em></p>
<p>En el caso de los temas:<br />
<em><br />
</em><strong>1.-</strong> /<em>topics</em><br />
<strong>2.-</strong> /<em>topics</em>/<strong>:topic_id</strong>/<em>topics</em></p>
<p><strong>AproximaciÃ³n: Crear un segundo controlador.</strong></p>
<p>Empecemos por el tema de los temas y sus subtemas. En este caso utilizaremos un segundo controlador al que llamaremos <em>subtopic</em>. Para poder acceder de la forma buscada hay que sustituir en el archivo <em>config</em>/<em>routes.rb </em>la lÃ­nea</p>
<p><code>map.resources :topics</code><br />
por lo siguiente:</p>
<p><code>map.resources :topics do |topic|<br />
topic.resources :subtopics, :path_prefix =&gt; "topics/:topic_id"<br />
end</code><br />
DespuÃ©s, se eliminan los mÃ©todos <em>delete</em>, <em>edit</em>, <em>show</em> y <em>update</em>, pues sÃ³lo se necesitan los mÃ©todos <em>create</em>, <em>index</em> y <em>new</em>. AdemÃ¡s, lo mÃ¡s lÃ³gico serÃ­a implementar los mÃ©todos <em>create</em>, <em>index</em> y <em>new</em> de forma que podamos aprovechar las vistas del controlador <em>topic</em>. AÃºn asÃ­, tenemos repeticiÃ³n, lo que viola el principio DRY que rige a Rails. Por lo tanto, veamos cÃ³mo podemos conseguir el resultado obtenido de una forma mÃ¡s sencilla y elegante.</p>
<p><strong>Fase final: las cosas bien hechas.</strong></p>
<p>En este caso cogeremos como ejemplo las descargas de un tema. Para ello, al igual que en el ejemplo anterior, hay que modificar el <em>routes.rb</em> aÃ±adiÃ©ndole las siguientes lÃ­neas</p>
<p><code>map.resources :topics do |topic|<br />
topic.resources :downloads, :path_prefix =&gt; "topics/:topic_id", :name_prefix =&gt; 'topic_'<br />
end</p>
<p>map.resources :downloads</code></p>
<p>Hay que recalcar dos aspectos de estas rutas. En primer lugar, el :name_prefix. De esta forma, podremos diferenciar entre si hay que crear un path del tipo /<em>downloads</em>/<em>1</em> o del tipo /<em>topics</em>/<strong>:topic_id</strong>/<em>downloads</em> simplemente precediendo el nombre de los mÃ©todos que construyen el path con <em>topic_</em>. Es decir, si utilizamos el mÃ©todo <code>edit_download_path(download)</code> obtenemos la ruta <em>http://localhost:3000/downloads/2;edit</em>. En cambio, al utilizar el mÃ©todo <code>topic_edit_download_path(download.topic,download)</code> (hay que recalcar que el <em>:name_prefix</em> va antes del nombre normal del mÃ©todo y que los parÃ¡metros se pasan segÃºn el orden en el que se encuentran en la ruta) obtenemos la ruta <em>http://localhost:3000/topics/1/downloads/2;edit</em>.<br />
Espero que este artÃ­culo os haya sido tan interesante (aunque me exprese como el culo) como para mÃ­ fue el investigar cÃ³mo se hace esta monerÃ­a con REST, Ruby y Ruby on Rails.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2007/09/03/anidamiento-de-recursos-con-rest-en-ruby-on-rails-o-como-acceder-de-dos-maneras-distintas-a-un-mismo-controlador-utilizando-rest-con-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
