<?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>6502.fr &#187; Ruby on Rails</title>
	<atom:link href="http://www.6502.fr/category/ruby-on-rails/feed" rel="self" type="application/rss+xml" />
	<link>http://www.6502.fr</link>
	<description>L&#039;Avant-dernier cri de la technologie</description>
	<lastBuildDate>Thu, 27 Jan 2011 14:23:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Éditer les gems avec gemedit</title>
		<link>http://www.6502.fr/editer-les-gems-avec-gemedit/289</link>
		<comments>http://www.6502.fr/editer-les-gems-avec-gemedit/289#comments</comments>
		<pubDate>Sun, 17 Oct 2010 13:03:59 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[Gem]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=289</guid>
		<description><![CDATA[La gem que vous utilisez a un comportement inattendu ? Allez lire le code ! Mais il est parfois fastidieux de trouver où est la gem, et gemedit facilite la vie en ajoutant une commande edit à gem. $ sudo gem install gemedit $ gem edit gemedit Vous pouvez indiquer l&#8217;éditeur que vous voulez lancer [...]]]></description>
			<content:encoded><![CDATA[<p>La <em>gem</em> que vous utilisez a un comportement inattendu ? <strong>Allez lire le code !</strong></p>

<p>Mais il est parfois fastidieux de trouver où est la <em>gem</em>, et <a href="http://gemedit.rubyforge.org/" title="[en anglais] Warning, colour attack!">gemedit</a> facilite la vie en ajoutant une commande <em>edit</em> à <em>gem</em>.</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> gemedit
$ gem edit gemedit</pre></div></div>


<p>Vous pouvez indiquer l&#8217;éditeur que vous voulez lancer grâce aux variables d&#8217;environnement $GEMEDITOR, $VISUAL ou $EDITOR. Pour utiliser TextMate, ajoutez cette ligne dans votre <em>.profile</em> :</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">GEMEDITOR</span>=mate</pre></div></div>


<p><img src="/wp-content/uploads/2010/10/TextMate.gif" alt="Gem gemedit opened in TextMate" /></p>

<p>Ou pour Xcode :</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">GEMEDITOR</span>=xed</pre></div></div>


<p>C&#8217;est tout de même plus rapide de taper <code>gem edit gemedit</code> que
<code>mate /usr/local/lib/ruby/gems/1.8/gems/gemedit-0.9.0</code> !</p>

<p><a href="http://gemedit.rubyforge.org/" title="[en anglais] Warning, colour attack!"><em>GEM Editor</em></a> via <a href="http://railstips.org/blog/archives/2010/10/14/stop-googling/" title="[en anglais]"><em>Stop Googling</em> (John Nunemaker)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/editer-les-gems-avec-gemedit/289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les ressources dans l&#8217;architecture REST : la source</title>
		<link>http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200</link>
		<comments>http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#comments</comments>
		<pubDate>Wed, 01 Sep 2010 15:33:24 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RESTful]]></category>
		<category><![CDATA[Roy Fielding]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=200</guid>
		<description><![CDATA[Traduction de la section « Resources and Resource Identifiers » de la thèse de Roy T. Fielding. 5.2.1.1 Ressources et identificateurs de ressources La ressource est le fondement de l&#8217;abstraction de l&#8217;information dans REST. Toute information qui peut être nommée peut être une ressource : un document ou une image, un service momentané (par exemple [...]]]></description>
			<content:encoded><![CDATA[<p>Traduction de la section « <a title="5.2.1.1 Resources and Resource Identifiers [en anglais]" href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_1">Resources and Resource Identifiers</a> » de la thèse de Roy T. Fielding.</p>

<h3>5.2.1.1 Ressources et identificateurs de ressources</h3>

<p>La <em>ressource</em> est le fondement de l&#8217;abstraction de l&#8217;information dans REST. Toute information qui peut être nommée peut être une ressource : un document ou une image, un service momentané (par exemple « le temps à Los Angeles aujourd&#8217;hui »), un ensemble d&#8217;autres ressources, un objet non virtuel (par exemple une personne), etc. Autrement dit, tout concept pouvant être la cible d&#8217;un lien hypertexte répond nécessairement à la définition de ressource. Une ressource est la référence conceptuelle<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_0_200" id="identifier_0_200" class="footnote-link footnote-identifier-link" title="a conceptual mapping">1</a></sup> vers un ensemble d&#8217;entités, pas une entité qui correspondrait à la référence à un instant donné.</p>

<p>Plus précisément, une ressource <em>R</em> est une fonction d&#8217;appartenance<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_1_200" id="identifier_1_200" class="footnote-link footnote-identifier-link" title="membership function">2</a></sup> <em>M</em><sub><small>R</small></sub><em>(t)</em>, qui au temps <em>t</em> associe un ensemble d&#8217;entités, ou de valeurs, qui sont équivalentes. Les valeurs de cet ensemble peuvent être des représentation de ressources<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_2_200" id="identifier_2_200" class="footnote-link footnote-identifier-link" title="resources representations">3</a></sup> ou des identifiants de ressources<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_3_200" id="identifier_3_200" class="footnote-link footnote-identifier-link" title="resource identifiers">4</a></sup>. Une ressource peut être associée à l&#8217;ensemble vide, ce qui permet de faire référence à un concept avant qu&#8217;aucune réalisation de ce concept n&#8217;existe — une notion étrangère à la plupart des systèmes hypertextes avant le Web. Certaines ressources sont statiques dans le sens où, examinées à tout moment après leur création, elles correspondent toujours au même ensemble de valeurs. D&#8217;autres ont un degré de variabilité élevé dans le temps. La seule chose qui doit être statique pour une ressource est la sémantique de la référence, puisque la sémantique est ce qui distingue une ressource d&#8217;une autre.</p>

<p>Par exemple, la « version préférée de l&#8217;auteur » d&#8217;une publication académique est une référence dont la valeur varie dans le temps, alors que la « version publiée dans les actes du colloque X » est statique. Ce sont deux ressources distinctes, même si elles font référence à la même valeur à un instant donné. La distinction est nécessaire pour que les deux ressources puissent être identifiées et classées indépendamment. Un exemple similaire dans le domaine de l&#8217;ingénierie logicielle est l&#8217;identification distincte d&#8217;un fichier de code source dans un système de gestion de versions, comme la « dernière révision », la « révision numéro 1.2.7 » ou la « révision incluse dans la version Orange ».</p>

<p>Cette définition abstraite d&#8217;une ressource rend possible des fonctions essentielles de l&#8217;architecture du Web. Premièrement, elle généralise en englobant plusieurs sources d&#8217;information sans les distinguer artificiellement par type ou par implémentation. Deuxièmement, elle autorise l&#8217;attachement tardif<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_4_200" id="identifier_4_200" class="footnote-link footnote-identifier-link" title="late binding">5</a></sup> de la référence à une représentation, ce qui rend possible une négociation de contenu<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_5_200" id="identifier_5_200" class="footnote-link footnote-identifier-link" title="content negociation">6</a></sup> basée sur les caractéristiques de la requête. Finalement, elle permet à l&#8217;auteur de référencer le concept plutôt qu&#8217;une représentation singulière de ce concept, supprimant ainsi le besoin de modifier tous les liens existants à chaque fois que la représentation change (en supposant que l&#8217;auteur a utilisé les bons identificateurs).</p>

<p>REST utilise un identificateur de ressource<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_6_200" id="identifier_6_200" class="footnote-link footnote-identifier-link" title="resource identifier">7</a></sup> pour identifier la ressource impliquée dans une interaction entre composants. Les connecteurs REST offrent une interface générique pour atteindre et manipuler l&#8217;ensemble de valeurs d&#8217;une ressource, indépendamment de la manière dont la fonction d&#8217;appartenance est définie ou du logiciel qui traite la requête. L&#8217;autorité de nommage qui a affecté l&#8217;identificateur de ressource, rendant possible le référencement de celle-ci, a la responsabilité du maintien de la validité sémantique de la référence<sup><a href="http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200#footnote_7_200" id="identifier_7_200" class="footnote-link footnote-identifier-link" title="mapping">8</a></sup> dans le temps (c&#8217;est-à-dire de s&#8217;assurer que la fonction d&#8217;appartenance ne change pas).</p>

<p>Les systèmes hypertextes traditionnels, qui opèrent typiquement en environnement clos ou local, utilisent des nœuds uniques ou des identificateurs de documents qui changent à chaque fois que l&#8217;information change, s&#8217;appuyant sur des serveurs de liens pour maintenir la référence séparément du contenu. Comme les serveurs de liens centralisés sont un anathème pour les exigences pluri-organisationnelles et à échelle gigantesque du Web, REST se repose au contraire sur l&#8217;auteur pour choisir l&#8217;identificateur de ressource qui convient le mieux à la nature du concept identifié. Naturellement, la qualité d&#8217;un identificateur est souvent proportionnelle à l&#8217;argent dépensé pour maintenir sa validité, ce qui conduit aux liens brisés, au fur et à mesure de la disparition ou du déplacement d&#8217;information éphémère ou peu maintenue.</p>
<h4>Notes</h4><ol class="footnotes"><li id="footnote_0_200" class="footnote"><em>a conceptual mapping</em></li><li id="footnote_1_200" class="footnote"><em>membership function</em></li><li id="footnote_2_200" class="footnote"><em>resources representations</em></li><li id="footnote_3_200" class="footnote"><em>resource identifiers</em></li><li id="footnote_4_200" class="footnote"><em>late binding</em></li><li id="footnote_5_200" class="footnote"><em>content negociation</em></li><li id="footnote_6_200" class="footnote"><em>resource identifier</em></li><li id="footnote_7_200" class="footnote"><em>mapping</em></li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/les-ressources-dans-l-architecture-rest-traduction/200/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les modifications de CSS n&#8217;apparaissent pas dans Spree</title>
		<link>http://www.6502.fr/les-modifications-de-css-napparaissent-pas-dans-spree/257</link>
		<comments>http://www.6502.fr/les-modifications-de-css-napparaissent-pas-dans-spree/257#comments</comments>
		<pubDate>Tue, 27 Jul 2010 15:19:18 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=257</guid>
		<description><![CDATA[En cours de développement, vos modifications de feuilles de style n&#8217;apparaissent pas sur le site ? C&#8217;est normal ! La structure de l&#8217;application est complexe. Si vous respectez l&#8217;architecture recommandée (version 0.11), vos feuilles de styles sont dans vendor/extensions/theme_xxxx/public/stylesheets/ (si votre thème s&#8217;appelle xxxx). Le serveur web n&#8217;est pas configuré pour aller chercher les assets [...]]]></description>
			<content:encoded><![CDATA[<p>En cours de développement, vos modifications de feuilles de style n&#8217;apparaissent pas sur le site ? C&#8217;est normal !</p>

<p>La structure de l&#8217;application est complexe. Si vous respectez l&#8217;architecture recommandée (version 0.11), vos feuilles de styles sont dans <code>vendor/extensions/theme_xxxx/public/stylesheets/</code> (si votre thème s&#8217;appelle <i>xxxx</i>).</p>

<p>Le serveur web n&#8217;est pas configuré pour aller chercher les <i>assets</i> ailleurs que dans <code>public</code>. Au démarrage de votre application, les fichiers CSS sont donc recopiés des répertoires des extensions dans le répertoire <code>public</code> principal.</p>

<p>Remarque finale : pour la même raison, un <i>commit</i> ou un <i>status</i> dans votre système de gestion de version vous montrera les vieux fichiers dans <code>public</code> si vous n&#8217;avez pas relancé votre serveur entre temps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/les-modifications-de-css-napparaissent-pas-dans-spree/257/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gérer plusieurs versions de Ruby sur Leopard</title>
		<link>http://www.6502.fr/plusieurs-versions-de-ruby-sur-leopard-avec-rvm/246</link>
		<comments>http://www.6502.fr/plusieurs-versions-de-ruby-sur-leopard-avec-rvm/246#comments</comments>
		<pubDate>Mon, 12 Jul 2010 14:15:34 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Outils]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=246</guid>
		<description><![CDATA[Un jour ou l&#8217;autre vous allez avoir besoin d&#8217;une gem qui exige une version plus récente de Ruby. Par exemple sqlite3. $ sudo gem install sqlite3 Password: ERROR: Error installing sqlite3: sqlite3 requires Ruby version &#62;= 1.9.1. Mais vous utilisez des gems qui ne sont pas compatibles avec Ruby&#160;1.9 et vous devez donc faire cohabiter [...]]]></description>
			<content:encoded><![CDATA[<p>Un jour ou l&#8217;autre vous allez avoir besoin d&#8217;une <i>gem</i> qui exige une version plus récente de Ruby. Par exemple <i>sqlite3</i>.</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> sqlite3
Password:
ERROR:  Error installing sqlite3:
	sqlite3 requires Ruby version <span style="color: #000000; font-weight: bold;">&gt;</span>= 1.9.1.</pre></div></div>


<p>Mais vous utilisez des <i>gems</i> qui ne sont pas compatibles avec Ruby&nbsp;1.9 et vous devez donc faire cohabiter plusieurs versions de Ruby. C&#8217;est là que <a title="RVM: Ruby Version Manager [en anglais]" href="http://rvm.beginrescueend.com/rvm/install/">RVM</a> intervient.</p>

<h3>Installer RVM sur Leopard</h3>

<p>Passez la commande suivante dans une fenêtre de Terminal&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> curl http:<span style="color: #000000; font-weight: bold;">//</span>rvm.beginrescueend.com<span style="color: #000000; font-weight: bold;">/</span>releases<span style="color: #000000; font-weight: bold;">/</span>rvm-install-head <span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>


<p>Puis ajoutez cette ligne à la fin de votre fichier <i>~/.profile</i>&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-s</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.rvm<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>rvm <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.rvm<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>rvm</pre></div></div>


<p>Pour tous les détails additionnels, allez <a title="RVM: Ruby Version Manager - Installing RVM [en anglais]" href="http://rvm.beginrescueend.com/rvm/install/">à la source</a>.</p>

<h3>Utiliser RVM</h3>

<p>Vous pouvez maintenant utiliser rvm, par exemple pour installer Ruby&nbsp;1.9.1.</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rvm <span style="color: #c20cb9; font-weight: bold;">install</span> 1.9.1 ; rvm 1.9.1
$ ruby <span style="color: #660033;">-v</span>
ruby 1.9.1p378 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2010</span>-01-<span style="color: #000000;">10</span> revision <span style="color: #000000;">26273</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>i386-darwin9.8.0<span style="color: #7a0874; font-weight: bold;">&#93;</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> sqlite3
Building native extensions.  This could take a while...
...
Successfully installed sqlite3-0.1.1</pre></div></div>


<p>Pour revenir à la version d&#8217;origine&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rvm system
$ ruby <span style="color: #660033;">-v</span>
ruby 1.8.7 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2009</span>-06-<span style="color: #000000;">12</span> patchlevel <span style="color: #000000;">174</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>i686-darwin9.8.0<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/plusieurs-versions-de-ruby-sur-leopard-avec-rvm/246/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSpec have_tag et Rails assert_select cheat sheet</title>
		<link>http://www.6502.fr/rspec-have_tag-et-rails-assert_select-cheat-sheet/216</link>
		<comments>http://www.6502.fr/rspec-have_tag-et-rails-assert_select-cheat-sheet/216#comments</comments>
		<pubDate>Tue, 25 Nov 2008 23:18:30 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[assert_select]]></category>
		<category><![CDATA[have_tag]]></category>
		<category><![CDATA[RSpec]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=216</guid>
		<description><![CDATA[have_tag (RSpec) et assert_select (Rails) facilitent le test des vues grâce à une syntaxe proche de celle du CSS. Vérifions par exemple la présence d&#8217;un titre qui contient le texte Subtitle et d&#8217;un formulaire (id=&#160;&#187;swap&#160;&#187;) avec deux boutons radio et un bouton de soumission (class=&#160;&#187;button_save&#160;&#187;)&#160;: response.should have_tag("h2", /Subtitle/) response.should have_tag("form#swap[method=post]") response.should have_tag("form#swap input[type=radio][name=?]", 'part1') response.should [...]]]></description>
			<content:encoded><![CDATA[<p><code>have_tag</code> (RSpec) et <code>assert_select</code> (Rails) facilitent le test des vues grâce à une syntaxe proche de celle du CSS. Vérifions par exemple la présence d&#8217;un titre qui contient le texte <i>Subtitle</i> et d&#8217;un formulaire (id=&nbsp;&raquo;swap&nbsp;&raquo;) avec deux boutons radio et un bouton de soumission (class=&nbsp;&raquo;button_save&nbsp;&raquo;)&nbsp;:</p>

<p><pre lang=ruby>
response.should have_tag("h2", /Subtitle/)
response.should have_tag("form#swap[method=post]")
response.should have_tag("form#swap input[type=radio][name=?]", 'part1')
response.should have_tag("form#swap input[type=radio][name=?]", 'part2')
response.should have_tag("form#swap input.button_save[type=submit]")
</pre></p>

<p>Autre exemple, un formulaire AJAX dans sa <code>div</code> (id=&nbsp;&raquo;filter&nbsp;&raquo;, mais vous avez compris maintenant) avec une liste déroulante, avec soumission par GET sur changement de la sélection&nbsp;:</p>

<p><pre lang=ruby>
response.should have_tag("select option", "All")
response.should have_tag("select option", /20/)
response.should_not have_tag("select option", /21/)
response.should have_tag("div#filter form[method=?]", 'get')
response.should have_tag("div#filter form select[onchange=?]", 'this.form.submit()')
</pre></p>

<p>La syntaxe du sélecteur a beau être proche de celle du CSS, il est difficile de s&#8217;en rappeler toutes les subtilités. C&#8217;est là qu&#8217;intervient l&#8217;excellente <em><a href="http://labnotes.org/svn/public/ruby/rails_plugins/assert_select/cheat/assert_select.html">cheat sheet</a></em> créée par Assaf Arkin de <a href="http://blog.labnotes.org/2006/09/04/assert_select-cheat-sheet/">Labnotes</a>. Indispensable&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/rspec-have_tag-et-rails-assert_select-cheat-sheet/216/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Déploiement Capistrano à partir de Windows</title>
		<link>http://www.6502.fr/deploiement-capistrano-a-partir-de-windows/205</link>
		<comments>http://www.6502.fr/deploiement-capistrano-a-partir-de-windows/205#comments</comments>
		<pubDate>Tue, 11 Nov 2008 00:27:52 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[Outils]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=205</guid>
		<description><![CDATA[Capistrano est un outil de déploiement puissant et facile d&#8217;emploi, dont j&#8217;ai déjà parlé. Il tourne sous Windows, Mac OS et Linux (entre autres) et est d&#8217;une mise en service aisée si l&#8217;on connait ssh et subversion. C&#8217;est pourquoi j&#8217;ai été fort (désagréablement) surpris quand mon récent cap deploy a échoué avec le message d&#8217;erreur [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Capistrano [en anglais]" href="http://www.capify.org/">Capistrano</a> est un outil de déploiement puissant et facile d&#8217;emploi, dont j&#8217;ai <a title="Capistrano – symboles :scm_user et :scm_username" href="/capistrano-scm_user-et-scm_username/196">déjà</a> <a title="Afficher une page de maintenance pendant le déploiement" href="/afficher-une-page-de-maintenance-pendant-le-deploiement/88">parlé</a>. Il tourne sous Windows, Mac OS et Linux (entre autres) et est d&#8217;une mise en service aisée si l&#8217;on connait ssh et <a title="Subversion [en anglais]" href="http://subversion.tigris.org/">subversion</a>.</p>

<p>C&#8217;est pourquoi j&#8217;ai été fort (désagréablement) surpris quand mon récent <code>cap deploy</code> a échoué avec le message d&#8217;erreur suivant :
<pre>c:/ruby/lib/ruby/gems/1.8/gems/capistrano-2.5.1/lib/capistrano/recipes/deploy.rb:97:in ``': No such file or directory - svn info http://svn.example.com/</pre>
On comprend bien qu&#8217;il s&#8217;agit de ma machine mobile et portable qui tourne sous Windows Vista. Le client SVN de choix sous Windows reste sans conteste <a title="TortoiseSVN [en anglais]" href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>. Malheureusement (d&#8217;une certaine manière), TortoiseSVN est un vrai client Subversion et non un <em>wrapper </em>graphique s&#8217;appuyant sur l&#8217;exécutable svn (en ligne de commande donc).</p>

<p>Or Capistrano invoque l&#8217;exécutable sus-cité, et ne le trouve pas. Solution simple et rapide : installer le client officiel SVN, que l&#8217;on peut trouver <a href="http://subversion.tigris.org/getting.html#binary-packages">ici</a>.</p>

<p>Et hop !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/deploiement-capistrano-a-partir-de-windows/205/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSpec : tester le contenu d&#8217;un content_for</title>
		<link>http://www.6502.fr/rspec-tester-le-contenu-de-content_for/198</link>
		<comments>http://www.6502.fr/rspec-tester-le-contenu-de-content_for/198#comments</comments>
		<pubDate>Sun, 02 Nov 2008 15:38:55 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[RSpec]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=198</guid>
		<description><![CDATA[Une spécification de vue sous RSpec pourrait ressembler à ça&#160;: it &#34;should render column titles&#34; do render &#34;/feeds/index.html.erb&#34; response.should have_tag&#40;&#34;tr&#62;th&#34;, &#34;name&#34;&#41; response.should have_tag&#40;&#34;tr&#62;th&#34;, &#34;url&#34;&#41; end Mais cette méthode ne permet pas de tester les bribes de HTML qui sont produites dans un content_for. En effet, ces bribes sont incluses directement dans le layout, pas dans [...]]]></description>
			<content:encoded><![CDATA[<p>Une spécification de vue sous RSpec pourrait ressembler à ça&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  it <span style="color:#996600;">&quot;should render column titles&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    render <span style="color:#996600;">&quot;/feeds/index.html.erb&quot;</span>
    response.<span style="color:#9900CC;">should</span> have_tag<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;tr&gt;th&quot;</span>, <span style="color:#996600;">&quot;name&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    response.<span style="color:#9900CC;">should</span> have_tag<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;tr&gt;th&quot;</span>, <span style="color:#996600;">&quot;url&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>Mais cette méthode ne permet pas de tester les bribes de HTML qui sont produites dans un <em>content_for</em>. En effet, ces bribes sont incluses directement dans le layout, pas dans la production de la vue. Pour ce faire, ajouter dans <em>spec_helper.rb</em>&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> content_for<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
    response.<span style="color:#9900CC;">template</span>.<span style="color:#9900CC;">instance_variable_get</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;@content_for_#{name}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>Puis dans les specs&nbsp;:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  it <span style="color:#996600;">&quot;should render a 'New feed' link&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    render <span style="color:#996600;">&quot;/feeds/index.html.erb&quot;</span>
    content_for<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:somewhere</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> have_tag<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;a[href=?]&quot;</span>, new_feed_path<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>Merci à <a title="rspec-users mailing list [en anglais]" href="http://rubyforge.org/pipermail/rspec-users/2007-June/001954.html">Carl-Johan Kihlbom</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/rspec-tester-le-contenu-de-content_for/198/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails : l&#8217;opérateur bang-bang !!</title>
		<link>http://www.6502.fr/ruby-on-rails-operateur-bang-bang/187</link>
		<comments>http://www.6502.fr/ruby-on-rails-operateur-bang-bang/187#comments</comments>
		<pubDate>Wed, 22 Oct 2008 07:30:17 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=187</guid>
		<description><![CDATA[Bon, ce n&#8217;est pas vraiment un opérateur, mais l&#8217;idiome est assez répandu et peut surprendre. Il est utilisé pour convertir nil en false, ce qui peut éviter des tests spécifiques comme if variable.nil? Deux petits rappels : ! est l&#8217;opérateur de négation logique. Seuls false et nil ont la valeur booléenne FAUX. Tout le reste [...]]]></description>
			<content:encoded><![CDATA[<p>Bon, ce n&#8217;est pas vraiment un opérateur, mais l&#8217;idiome est assez répandu et peut surprendre. Il est utilisé pour convertir <em>nil</em> en <em>false</em>, ce qui peut éviter des tests spécifiques comme <code>if variable.nil?</code></p>

<p>Deux petits rappels :</p>

<ol>
  <li><strong>!</strong> est l&#8217;opérateur de négation logique.</li>
  <li>Seuls <em>false</em> et <em>nil</em> ont la valeur booléenne FAUX. Tout le reste est vrai (y compris 0, la chaîne de caractère vide, etc.</li>
</ol>

<p>Nous en déduisons la table de vérité suivante :</p>

<table style="border: 1px solid #999999;">
<tr>
  <td width="100px" style="text-align: center;"><strong>variable</strong></td>
  <td width="100px" style="text-align: center;"><strong>!variable</strong></td>
  <td width="100px" style="text-align: center;"><strong>!!variable</strong></td>
</tr>
<tr>
  <td style="text-align: center;">*</td>
  <td style="text-align: center;">false</td>
  <td style="text-align: center;">true</td></tr>
<tr>
  <td style="text-align: center;">false</td>
  <td style="text-align: center;">true</td>
  <td style="text-align: center;">false</td>
</tr>
<tr>
  <td style="text-align: center;">nil</td>
  <td style="text-align: center;">true</td>
  <td style="text-align: center;">false</td>
</tr>
</table>

<ul>
<li>= n&#8217;importe quoi sauf <em>nil</em> ou <em>false</em>, donc de valeur booléenne <em>true</em>.</li>
</ul>

<p>CQFD.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/ruby-on-rails-operateur-bang-bang/187/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rails : chargement des données initiales dans la base de données</title>
		<link>http://www.6502.fr/rails-chargement-des-donnees-initiales-dans-la-base-de-donnees/176</link>
		<comments>http://www.6502.fr/rails-chargement-des-donnees-initiales-dans-la-base-de-donnees/176#comments</comments>
		<pubDate>Mon, 15 Sep 2008 18:47:10 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=176</guid>
		<description><![CDATA[Il est fréquent que les applications aient besoin, pour fonctionner, de données initiales dans la base de données. Il y a plusieurs avis dans la communauté sur le moyen de charger ces données. Aucune méthode préférentielle ne se dégage. En particulier, les méthodes proposant de créer les données de test avec le code de l&#8217;application [...]]]></description>
			<content:encoded><![CDATA[<p>Il est fréquent que les applications aient besoin, pour fonctionner, de données initiales dans la base de données. Il y a plusieurs avis dans la communauté sur le moyen de charger ces données.</p>

<p>Aucune méthode préférentielle ne se dégage. En particulier, les méthodes proposant de créer les données de test avec le code de l&#8217;application sont inapplicables pour une importation sérieuse, tant par leur lourdeur que par la difficulté de maintenir les données de test au fur de l&#8217;évolution du code. J&#8217;ai choisi trois articles qui couvrent bien le sujet.</p>

<p>Luke Francl a écrit un article qui balaye les diverses possibilités <a href="http://railspikes.com/2008/2/1/loading-seed-data">Loading seed data</a>.</p>

<p><a href="http://www.intridea.com/authors/Michael%20Bleigh">Michael Bleigh</a> propose, dans son article <a href="http://www.intridea.com/2008/4/20/seed-fu-simple-seed-data-for-rails">Seed Fu: Simple Seed Data for Rails</a>, de créer les données grâce à des scripts Ruby placés dans le répertoire <em>db/fixtures</em>.</p>

<p>Enfin, Jeffrey Allan Hardy décrit dans <a href="http://quotedprintable.com/2007/11/16/seed-data-in-rails">Seed Data in Rails</a> la méthode simple et aisée à mettre en œuvre que j&#8217;ai retenue. Il s&#8217;agit d&#8217;utiliser le puissant mécanisme des fixtures dans une tâche <em>rake</em>.</p>

<p>Les données sont saisies dans des fichiers YAML placés dans le nouveau répertoire <em>db/fixtures</em>. Une tâche rake est ajouté en créant le fichier <em>db_seed.rake</em> dans le répertoire <em>lib/tasks</em>.</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">namespace <span style="color:#ff3333; font-weight:bold;">:db</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  desc <span style="color:#996600;">&quot;Load seed fixtures (from db/fixtures) into the current environment's database.&quot;</span> 
  task <span style="color:#ff3333; font-weight:bold;">:seed</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'active_record/fixtures'</span>
    <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">glob</span><span style="color:#006600; font-weight:bold;">&#40;</span>RAILS_ROOT <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/db/fixtures/*.yml'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>file<span style="color:#006600; font-weight:bold;">|</span>
      Fixtures.<span style="color:#9900CC;">create_fixtures</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'db/fixtures'</span>, <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>file, <span style="color:#996600;">'.*'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>Et voilà&nbsp;! Les données sont chargées avec la commande <strong>rake db:seed</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/rails-chargement-des-donnees-initiales-dans-la-base-de-donnees/176/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Localisation de Ruby on Rails</title>
		<link>http://www.6502.fr/localisation-de-ruby-on-rails/172</link>
		<comments>http://www.6502.fr/localisation-de-ruby-on-rails/172#comments</comments>
		<pubDate>Sun, 14 Sep 2008 21:45:00 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[l10n]]></category>

		<guid isPermaLink="false">http://www.6502.fr/?p=172</guid>
		<description><![CDATA[Je suis en train de traduire les fichiers de régionalisation (l10n, de l&#8217;anglais localization) de l&#8217;application de démonstration de Clemens Kofler. L&#8217;internationalisation de Rails sera intégrée dans la version 2.2 qui est prévue pour la fin de l&#8217;année]]></description>
			<content:encoded><![CDATA[<p>Je suis en train de traduire les fichiers de régionalisation (<a title="Internationalisation de logiciel sur Wikipedia" href="http://fr.wikipedia.org/wiki/L10n">l10n</a>, de l&#8217;anglais <em>localization</em>) de l&#8217;<a title="Application de démonstration l10n et i18n [multilingue]" href="http://localhost:3000/">application de démonstration</a> de <a title="Blog de Clemens Kofler [en anglais]" href="http://www.railway.at/">Clemens Kofler</a>.</p>

<p>L&#8217;<a title="The Ruby on Rails I18n core api [en anglais]" href="http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api">internationalisation</a> de Rails sera intégrée dans la version 2.2 qui est prévue pour la fin de l&#8217;année</p>
]]></content:encoded>
			<wfw:commentRss>http://www.6502.fr/localisation-de-ruby-on-rails/172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

