<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.pagesd.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>blog.pagesd.info</title>
  <link>http://blog.pagesd.info/</link>
  <atom:link href="http://blog.pagesd.info/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Seconde tentative pour regrouper toutes mes notes de développement qui jusqu'ici étaient dispersées un peu de partout (dans le meilleur des cas) voire consignées sur des bouts de papiers avant de disparaitre.</description>
  <language>fr</language>
  <pubDate>Sat, 31 Jul 2010 16:26:03 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>ASP.NET MVC 2 : Des helpers HTML fortement typés</title>
    <link>http://blog.pagesd.info/post/2010/01/12/asp-net-mvc-2-helpers-html_fortement-types</link>
    <guid isPermaLink="false">urn:md5:07348f24aef759ab84a77691e36fc10f</guid>
    <pubDate>Sat, 31 Jul 2010 18:26:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Traductions</category>
        <category>.net</category><category>MVC</category><category>Traduction</category>    
    <description>    &lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2010/01/10/asp-net-mvc-2-strongly-typed-html-helpers.aspx&quot; hreflang=&quot;us&quot;&gt;ASP.NET MVC 2: Strongly Typed Html Helpers&lt;/a&gt;&amp;quot; de Scott
Guthrie.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ceci est le premier billet d'une série consacrée à la prochaine sortie de
ASP.NET MVC 2. Ce billet présente les nouveaux helpers fortement typés qui ont
fait leur apparition dans ASP.NET MVC 2.&lt;/p&gt;
&lt;h3&gt;Les helpers HTML actuels&lt;/h3&gt;
&lt;p&gt;ASP.NET MVC 1 est fourni avec un certain nombre de helpers HTML que vous
pouvez utiliser dans les vues pour simplifier la génération de l'interface
utilisateur en HTML. Par exemple, pour afficher une textbox, vous pouvez
utiliser le helper Html.TextBox() de la façon suivante dans une de vos
vues :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_73A48C5E.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le premier paramètre de la méthode helper ci-dessus fournit le nom et l'id
pour la textbox et le second paramètre défini la valeur qu'elle doit contenir.
Ce helper aura comme effet de produire le code HTML suivant :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_51D8B3CD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Les nouveaux helpers HTML fortement typés&lt;/h3&gt;
&lt;p&gt;Une des fonctionnalités qui nous a le plus été demandée était de gérer des
helpers HTML fortement typés basés sur des expressions lambda pour référencer
les objets Model ou ViewModel passés aux vues. Cela permet une meilleure
vérification des vues au moment de la compilation (et donc de découvrir les
bugs lors de la programmation et pas de l'exécution) et aussi la possibilité de
profiter de l'intellisense dans les vues.&lt;/p&gt;
&lt;p&gt;Les nouveaux helpers HTML fortement typés font désormais parti de ASP.NET
MVC 2. Ces méthodes utilisent la convention de nommage &amp;quot;Html.HelperNameFor()&amp;quot;,
comme par exemple : Html.TextBoxFor(), Html.CheckBoxFor(),
Html.TextAreaFor()... Ils autorisent l'utilisation d'une expression lambda pour
définir en une fois les attributs id/name et la valeur du contrôle à
générer.&lt;/p&gt;
&lt;p&gt;Par exemple, avec ASP.NET MVC 2, nous pouvons maintenant utiliser le nouveau
helper Html.TextBoxFor() en plus du Html.TextBox() classique :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_6923B83E.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vous remarquerez dans le code ci-dessus que nous n'avons plus besoin
d'utiliser la chaine &amp;quot;ProductName&amp;quot;. Les expressions lambda sont suffisamment
souples pour permettre de retrouver le nom de la propriété ou du champ dans
notre modèle d'objets en plus de sa valeur.&lt;/p&gt;
&lt;p&gt;Etant donné que les helpers HTML sont fortement typés, cela nous permet
d'avoir accès à l'intellisense de Visual Studio lorsque nous écrivons
l'expression lambda :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_4757DFAD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le code HTML généré est exactement le même que pour la version présentée
dans le premier exemple :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_51D8B3CD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Les helpers HTML fortement typés fournis avec ASP.NET MVC 2&lt;/h3&gt;
&lt;p&gt;ASP.NET MVC 2 intègre d'ores et déjà les helpers HTML fortement typés
suivants :&lt;/p&gt;
&lt;h4&gt;Eléments HTML&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Html.TextBoxFor()&lt;/li&gt;
&lt;li&gt;Html.TextAreaFor()&lt;/li&gt;
&lt;li&gt;Html.DropDownListFor()&lt;/li&gt;
&lt;li&gt;Html.CheckboxFor()&lt;/li&gt;
&lt;li&gt;Html.RadioButtonFor()&lt;/li&gt;
&lt;li&gt;Html.ListBoxFor()&lt;/li&gt;
&lt;li&gt;Html.PasswordFor()&lt;/li&gt;
&lt;li&gt;Html.HiddenFor()&lt;/li&gt;
&lt;li&gt;Html.LabelFor()&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Autres helpers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Html.EditorFor()&lt;/li&gt;
&lt;li&gt;Html.DisplayFor()&lt;/li&gt;
&lt;li&gt;Html.DisplayTextFor()&lt;/li&gt;
&lt;li&gt;Html.ValidationMessageFor()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je reviendrai sur les nouvelles méthodes helpers Html.EditorFor() et
Html.DisplayFor() dans un autre billet de cette série quand j'aborderai les
évolutions apportées à la fonctionalité d'auto-scaffold en ASP.NET MVC 2. Nous
verrons aussi le helper Html.ValidationMessageFor() dans le prochain billet de
cette série qui présentera les nouveautés en matière de validation apportées
par ASP.NET MVC 2.&lt;/p&gt;
&lt;h3&gt;Les helpers HTML fortement typés et le Scaffolding&lt;/h3&gt;
&lt;p&gt;VS 2008 et VS 2010 utilisent désormais tous les deux les nouveaux helpers
fortement typés pour auto-générer les vues fortement typées à partir de la
commande &amp;quot;Add View&amp;quot;.&lt;/p&gt;
&lt;p&gt;Par exemple, supposons que nous ayons une classe &amp;quot;ProductsController&amp;quot; toute
simple comme ci-dessous avec une action Edit() qui renvoie un formulaire de
modification pour un objet &amp;quot;Product&amp;quot; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_76C64E79.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dans Visual Studio, nous pouvons faire un clic-droit à l'intérieur de
l'action Edit() et choisir la commande &amp;quot;Add View&amp;quot; dans le menu contextul pour
créer une nouvelle vue. Nous choisirons de créer une vue selon le modèle &amp;quot;Edit&amp;quot;
qui sera basée sur un objet de type &amp;quot;Product&amp;quot; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_5083F521.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Avec ASP.NET MVC 2, la vue qui a été créée par défaut utilise désormais les
nouveaux helpers HTML fortement typés pour faire référence à l'objet
Product :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://weblogs.asp.net/blogs/scottgu/image_thumb_1815CE49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Les helpers HTML fortement typés intégrés avec ASP.NET MVC 2 fournissent une
méthode pratique pour obtenir un contrôle du type de données à l'intérieur de
nos vues. Ils permettent un meilleur contrôle de nos vues dès la compilation
(ce qui vous permet de détecter les erreurs à la compilation et pas à
l'utilisation) et ils offrent un support de l'intellisense plus puissant
lorsque vous codez vos vues depuis Visual Studio.&lt;/p&gt;
&lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2010/01/10/asp-net-mvc-2-strongly-typed-html-helpers.aspx&quot; hreflang=&quot;us&quot;&gt;ASP.NET MVC 2: Strongly Typed Html Helpers&lt;/a&gt;&amp;quot; de Scott
Guthrie.&lt;/p&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/01/12/asp-net-mvc-2-helpers-html_fortement-types#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/01/12/asp-net-mvc-2-helpers-html_fortement-types#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/474872</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 28/07/2010</title>
    <link>http://blog.pagesd.info/post/2010/07/29/Blogmarks-du-28/07/2010</link>
    <guid isPermaLink="false">urn:md5:63cbac95f6a6a5b58a73038c4433996d</guid>
    <pubDate>Thu, 29 Jul 2010 10:35:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://gitref.org/&quot;&gt;Git Reference&lt;/a&gt; : Un petit site pour
apprendre et mémoriser rapidement les principales commandes de Git (et les plus
utilisées)&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/git&quot;&gt;git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/29/Blogmarks-du-28/07/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/29/Blogmarks-du-28/07/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/535846</wfw:commentRss>
      </item>
    
  <item>
    <title>Création d'un premier projet avec Sinatra</title>
    <link>http://blog.pagesd.info/post/2010/07/27/creation-premier-projet-sinatra</link>
    <guid isPermaLink="false">urn:md5:c2f285241a4796833d0f276c385798e7</guid>
    <pubDate>Wed, 28 Jul 2010 19:45:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category><category>Ruby</category><category>Sinatra</category><category>Tutoriel</category>    
    <description>    &lt;p&gt;Après avoir brillamment suivi pas à pas mon premier tutoriel pour installer
&lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; et &lt;a href=&quot;http://www.sinatrarb.com/&quot; hreflang=&quot;us&quot;&gt;Sinatra&lt;/a&gt; sur mon PC Windows 7, je
continue sur ma lancée avec la réalisation du deuxième tutoriel proposé par
&lt;a href=&quot;http://dazzl.co.uk/&quot; hreflang=&quot;us&quot;&gt;Darren Jones&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le but de ce tutoriel est de programmer une première application très très
simple qui va se contenter d'afficher un texte à l'envers, d'où son nom :
&lt;a href=&quot;http://ididitmyway.heroku.com/past/2010/1/10/project_1_reverse/&quot; hreflang=&quot;us&quot;&gt;Projet 1 : Reverse&lt;/a&gt;. A travers cette mini-application, on
peut déjà apprendre quelques trucs sur le fonctionnement de Sinatra, voire sur
Ruby si on débute comme moi.&lt;/p&gt;
&lt;h3&gt;C'est parti&lt;/h3&gt;
&lt;p&gt;Pour commencer, j'ai créé un répertoire C:\Ruby\projets\reverse puis un
fichier main.rb à l'intérieur :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  &amp;quot;I did it my way!&amp;quot;
end
&lt;/pre&gt;
&lt;p&gt;Toutes les applications Sinatra ont besoin des deux premières lignes. Il y a
ensuite une ligne blanche pour faire plus joli puis 3 lignes de code où se
situe toute l'action :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;«&lt;code&gt;get&lt;/code&gt;» indique quelle méthode HTTP on souhaite gérer : un
GET dans le cas présent,&lt;/li&gt;
&lt;li&gt;«&lt;code&gt;'/'&lt;/code&gt;» correspond à la route à gérer, soit la racine de
l'application dans ce cas,&lt;/li&gt;
&lt;li&gt;«&lt;code&gt;do ... end&lt;/code&gt;» est un bloc de code pour définir ce qui se passe
quand quelqu'un demande la racine du site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La dernière ligne à l'intérieur du bloc «&lt;code&gt;do ... end&lt;/code&gt;» contient
toujours (je pense) ce qui sera affiché dans la page, soit &amp;quot;I did it my way!&amp;quot;
dans ce premier exemple.&lt;/p&gt;
&lt;p&gt;Pour tester ce code, on peut directement double-cliquer sur le fichier
main.rb dans le répertoire C:\Ruby\projets\reverse ou faire ça à la main dans
une invite de commande :&lt;/p&gt;
&lt;pre&gt;
C:\Ruby\projets\reverse&amp;gt;ruby main.rb
&lt;/pre&gt;
&lt;p&gt;Et Sinatra entre en scène :&lt;/p&gt;
&lt;pre&gt;
== Sinatra/1.0 has taken the stage on 4567 for development with backup from WEBrick
[2010-07-27 21:44:57] INFO  WEBrick 1.3.1
[2010-07-27 21:44:57] INFO  ruby 1.9.1 (2010-07-02) [i386-mingw32]
[2010-07-27 21:44:57] INFO  WEBrick::HTTPServer#start: pid=3604 port=4567
&lt;/pre&gt;
&lt;p&gt;On peut alors lancer un navigateur pour appeler l'URL
http://localhost:4567/ :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-1.png&quot; alt=&quot;reverse-1.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tant qu'on est là, si on essaie d'aller sur une URL qui n'existe pas, comme
http://localhost:4567/reverse, on obtient alors la page d'erreur 404 de Sinatra
pour indiquer qu'il ne connait pas ce morceau :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-2.png&quot; alt=&quot;reverse-2.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cette page d'erreur nous conseille même sur la route ajouter dans notre
fichier pour que cela fonctionne, en l'occurrence :&lt;/p&gt;
&lt;pre&gt;
get '/reverse' do
  &amp;quot;Hello World&amp;quot;
end
&lt;/pre&gt;
&lt;p&gt;Avec Sinatra, c'est pas plus compliqué que ça pour créer des actions
correspondant à différentes routes.&lt;/p&gt;
&lt;h3&gt;Ajouter une vue&lt;/h3&gt;
&lt;p&gt;Pour l'instant, on va rester sur notre route «&lt;code&gt;'/'&lt;/code&gt;» et essayer
de faire un peu mieux que de seulement renvoyer une ligne de texte. Pour cela,
il faut créer une vue en modifiant le fichier main.rb de la façon
suivante :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  erb :home
end

__END__

@@ home

&amp;lt;h1&amp;gt;Reverse&amp;lt;/h1&amp;gt;

&amp;lt;p&amp;gt;Welcome to the home page of my very first Sinatra app.&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Ce coup-ci, au lieu d'utiliser la dernière ligne du bloc pour dire à Sinatra
ce qu'il doit afficher, nous lui avons demandé d'utiliser la vue &amp;quot;home&amp;quot; que
nous avons codé en erb (embedded ruby). Cette vue est enregistrée à la fin du
fichier, après la ligne &lt;code&gt;__END__&lt;/code&gt; et elle est repéré par le code
&lt;code&gt;@@ home&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour voir ce que donne cette vue, il faut revenir à l'invite de commande et
arrêter le serveur s'il est toujours en cours d'exécution. Ctrl-C =&amp;gt;Sinatra
has ended his set (crowd applauds). Puis on relance le serveur avec &lt;code&gt;ruby
main.rb&lt;/code&gt; et on réaffiche la page http://localhost:4567 :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-3.png&quot; alt=&quot;reverse-3.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Créer une vue externe&lt;/h3&gt;
&lt;p&gt;En fait, on n'est pas obligé de stocker les vues dans le même fichier. Il
est bien plus pratique de les enregistrer dans un sous-répertoire &amp;quot;views&amp;quot; de
notre projet (soit C:\Ruby\projets\reverse\views dans mon cas).&lt;/p&gt;
&lt;p&gt;Là, il suffit de créer le fichier &amp;quot;home.erb&amp;quot; avec le code
ci-dessous :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;h1&amp;gt;Reverse&amp;lt;/h1&amp;gt;

&amp;lt;p&amp;gt;Welcome to the home page of my very first Sinatra app.&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Il est alors possible de simplifier le fichier &amp;quot;main.rb&amp;quot; de la façon
suivante :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  erb :home
end
&lt;/pre&gt;
&lt;p&gt;Il ne reste plus qu'à contrôler que tout est ok : Ctrl-C, ruby main.rb,
rafraichir la page et vérifier que rien n'a changé.&lt;/p&gt;
&lt;h3&gt;Créer un layout&lt;/h3&gt;
&lt;p&gt;D'un point de vue visuel, on peut faire encore mieux en définissant un
&amp;quot;layout&amp;quot; qui servira de gabarit pour englober toutes les vues. Cela permet
d'éviter de répéter le même code dans toutes les vues de l'application.&lt;/p&gt;
&lt;p&gt;Pour cela, on doit juste créer un fichier &amp;quot;layout.erb&amp;quot; dans le
sous-répertoire &amp;quot;views&amp;quot; et y saisir le code html ci-dessous :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Reverse!&amp;lt;/title&amp;gt;
&amp;lt;meta charset=utf-8 /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Reverse&amp;lt;/h1&amp;gt;

&amp;lt;%= yield %&amp;gt;

&amp;lt;p&amp;gt;The first Sinatra project for I Did It My Way&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Tout ce code html sera toujours affiché à chaque fois qu'une vue sera
affichée, à part la ligne &lt;code&gt;&amp;lt;%= yield %&amp;gt;&lt;/code&gt; qui sera remplacée
par le contenu spécifique de la vue.&lt;/p&gt;
&lt;p&gt;Ainsi, si on modifie légèrement le code de la vue &amp;quot;home.erb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;h2&amp;gt;Home&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;Welcome to the home page. This app is going to be amazing....&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Le fait de relancer le serveur et de ré-afficher l'URL http://localhost:4567
doit donner le résultat suivant :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-4.png&quot; alt=&quot;reverse-4.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, le sous-titre &amp;quot;Home&amp;quot; et le message
&amp;quot;Welcome...&amp;quot; en provenance de la vue &amp;quot;home.erb&amp;quot; apparaissent entre le titre
&amp;quot;Reverse&amp;quot; et le paragraphe &amp;quot;The first app...&amp;quot;, soit exactement là où se situait
la ligne &lt;code&gt;&amp;lt;%= yield %&amp;gt;&lt;/code&gt; dans le fichier &amp;quot;layout.erb&amp;quot;.&lt;/p&gt;
&lt;h3&gt;ERB&lt;/h3&gt;
&lt;p&gt;La balise &lt;code&gt;&amp;lt;%= yield %&amp;gt;&lt;/code&gt; est un exemple d'&lt;strong&gt;embedded
ruby&lt;/strong&gt; (ou erb en abrégé). On peut ainsi ajouter du code ruby dans les
fichiers html en l'insérant à l'intérieur de blocs &lt;code&gt;&amp;lt;% ...
%&amp;gt;&lt;/code&gt;. C'est très utile dans le cas de conditions
&lt;code&gt;if&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% if something_happens %&amp;gt;
&amp;lt;h1&amp;gt;Something happened&amp;lt;/h1&amp;gt;
&amp;lt;% else %&amp;gt;
&amp;lt;h1&amp;gt;Nothing happend&amp;lt;/h1&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Si le code ruby est placé dans un bloc &lt;code&gt;&amp;lt;%= ... %&amp;gt;&lt;/code&gt;, alors
ce code est évalué et son résultat est affiché. Comme par exemple dans le code
suivant :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% title = &amp;quot;Reverse&amp;quot; %&amp;gt;
&amp;lt;h1&amp;gt;
&amp;lt;%= title %&amp;gt;
&amp;lt;/h1&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Le premier bloc de code &lt;code&gt;&amp;lt;% ... %&amp;gt;&lt;/code&gt; défini une variable
appelée &amp;quot;title&amp;quot; et le second bloc de code &lt;code&gt;&amp;lt;%= ... %&amp;gt;&lt;/code&gt; évalue
cette variable et affiche sa valeur. Même si cet exemple est ultra simple, dans
la vrai vie on peut faire des tas de chose très utile grâce à l'embedded
ruby.&lt;/p&gt;
&lt;h3&gt;Définir une variable&lt;/h3&gt;
&lt;p&gt;Plus concrètement, nous allons utiliser embeded ruby pour définir le titre
de notre page. Dans un premier temps, on met à jour le code de
&amp;quot;main.rb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Home&amp;quot;
  erb :home
end
&lt;/pre&gt;
&lt;p&gt;Celui-ci initialise une variable session nommée @title (c'est une variable
session parce que son nom débute par un @). Les variables session sont
disponibles dans les autres parties du code, y compris dans les vues. On peut
donc maintenant faire référence à notre variable session @title dans notre vue
ou même notre layout.&lt;/p&gt;
&lt;p&gt;Par conséquent, nous pouvons modifier &amp;quot;layout.erb&amp;quot; pour qu'il utilise notre
variable session :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Reverse!&amp;lt;/title&amp;gt;
&amp;lt;meta charset=utf-8 /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Reverse&amp;lt;/h1&amp;gt;
&amp;lt;h2&amp;gt;&amp;lt;%= @title %&amp;gt;&amp;lt;/h2&amp;gt;

&amp;lt;%= yield %&amp;gt;

&amp;lt;p&amp;gt;The first Sinatra project for I Did It My Way&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Puis nous pouvons alors supprimer le titre qui était en dur dans la vue
&amp;quot;home.erb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;p&amp;gt;Welcome to the home page. This app is going to be amazing....&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Par acquit de conscience, on peut redémarrer le serveur et contrôler que
rien n'a changé, ce qui signifie que notre variable session a bien été prise en
compte et que nous pouvons maintenant définir le titre de la page au niveau de
l'action.&lt;/p&gt;
&lt;p&gt;On va vérifier cela en créant une nouvelle route dans le source
&amp;quot;main.rb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Home&amp;quot;
  erb :home
end

get '/frank' do
  @title = &amp;quot;My Way&amp;quot;
  erb :home
end
&lt;/pre&gt;
&lt;p&gt;Après avoir encore une fois redémarré le serveur, on peut aller à la page
http://localhost:4567/frank pour constater que le sous-titre n'est plus &amp;quot;Home&amp;quot;
mais &amp;quot;My Way&amp;quot; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-5.png&quot; alt=&quot;reverse-5.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mais on continue à voir presque la même chose, étant donné qu'on utilise la
même vue dans les deux cas. On va donc créer une vue différente qui s'affichera
pour la route &amp;quot;/frank&amp;quot;. Pour cela, on saisi le code suivant dans un fichier
&amp;quot;frank.erb&amp;quot; à créer dans le sous-répertoire &amp;quot;views&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;p&amp;gt;
And now, the end is here
And so I face the final curtain
My friend, I'll say it clear
I'll state my case, of which I'm certain
I've lived a life that's full
I traveled each and ev'ry highway
And more, much more than this, I did it my way
&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Il faut aussi changer la ligne &lt;code&gt;erb:home&lt;/code&gt; par
&lt;code&gt;erb:frank&lt;/code&gt; dans le cas de la route &amp;quot;/frank&amp;quot; avant de redémarrer le
serveur et de ré-afficher la page http://localhost:4567/frank pour voir ce que
cela donne.&lt;/p&gt;
&lt;h3&gt;Poster quelque chose&lt;/h3&gt;
&lt;p&gt;Jusqu'à présent on n'a pas fait grand chose d'autre que des pages statiques.
Mais quand on crée une application web, c'est quand même pour avoir un peu
d'interaction avec le visiteur. On va donc rendre les choses un peu plus
intéressante en commençant par créer un formulaire dans notre page d'accueil.
Pour cela, on remplace tout le code de &amp;quot;home.erb&amp;quot; par le code
suivant :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;form action=&amp;quot;/reverse&amp;quot; method =&amp;quot;post&amp;quot; accept-charset=&amp;quot;utf-8&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;phrase&amp;quot; name=&amp;quot;phrase&amp;quot; value=&amp;quot;Write something...&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;...and reverse it!&amp;quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Une fois que c'est fait, on a aussi besoin d'une nouvelle action pour
prendre en compte le formulaire lorsqu'il est envoyé. Si vous observez le code
html de &amp;quot;home.erb&amp;quot;, vous pouvez voir que le formulaire va être posté à l'URL
&amp;quot;/reverse&amp;quot; avec une méthode POST.&lt;/p&gt;
&lt;p&gt;Normalement, c'est le moment où vous devriez vous rendre compte que la
syntaxe de Sinatra est bien faite. Et vous devriez même avoir une idée ce que
nous allons ajouter dans le fichier &amp;quot;main.erb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Home&amp;quot;
  erb :home
end

post '/reverse' do
  params.inspect
end
&lt;/pre&gt;
&lt;p&gt;L'avant-avant dernière ligne (l'antépénultième pour les érudits) défini la
nouvelle action qui va gérer la route &amp;quot;/reverse&amp;quot;. Cette action est définie pour
une route de type POST, ce qui signifie qu'elle ne sera activé que pour une
requête POST (ce qui correspond à l'envoi d'un formulaire). Ca c'est bon ?
Mais par contre, c'est quoi cette ligne &lt;code&gt;params.inspect&lt;/code&gt; ?
&amp;quot;params&amp;quot; est une collection qui contient toutes les informations qui ont été
envoyées en tant que paramètre (aussi bien à travers un formulaire que via
l'URL) Par conséquent, &lt;code&gt;params.inspect&lt;/code&gt; affiche les paires
clé/valeur correspondantes à tous ces paramètres.&lt;/p&gt;
&lt;p&gt;Allez. On relance le serveur, on accède à la page http://localhost:4567/, on
saisi une phrase au hasard et on clique sur le bouton [... and reverse
it] :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-6.png&quot; alt=&quot;reverse-6.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cela signifie que la clé &amp;quot;phrase&amp;quot; contient la valeur &amp;quot;I Did It My Way&amp;quot;. Et
nous avons une clé &amp;quot;phrase&amp;quot; parce que le formulaire dans &amp;quot;home.erb&amp;quot; contient
une balise input dont l'attribut name est &amp;quot;phrase&amp;quot;. Il est possible d'accéder à
n'importe quel paramètre stocké dans la collection &amp;quot;params&amp;quot; en employant la
syntaxe &lt;code&gt;params[:key]&lt;/code&gt;. Par exemple, &lt;code&gt;params[:phrase]&lt;/code&gt;
renverra &amp;quot;I Did It My Way&amp;quot;.&lt;/p&gt;
&lt;p&gt;Supposons que l'on ait le formulaire suivant :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;form action=&amp;quot;/reverse&amp;quot; method =&amp;quot;post&amp;quot; accept-charset=&amp;quot;utf-8&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;password&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;submit&amp;quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;On va pouvoir accéder aux valeurs de ce formulaire en utilisant
&lt;code&gt;params[:name]&lt;/code&gt;, &lt;code&gt;params[:email]&lt;/code&gt; et
&lt;code&gt;params[:password]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Maintenant que nous savons comment accéder aux données d'un formulaire, nous
allons pouvoir faire quelque chose du texte saisi dans notre vue. Pour cela,
nous ajoutons le code ci-dessous au fichier &amp;quot;main.rb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Enter Your text here&amp;quot;
  erb :home
end

post '/reverse' do
  @title = &amp;quot;Here's Your Reversed Text:&amp;quot;
  params[:phrase].reverse
end
&lt;/pre&gt;
&lt;p&gt;On re-démarre le serveur, on ré-accède à la page http://localhost:4567/, on
re-saisi une phrase au hasard et on re-clique sur le bouton [... and reverse
it]. Cette fois-ci, on doit voir la phrase saisie affichée à l'envers, de la
droite vers la gauche :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-7.png&quot; alt=&quot;reverse-7.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On obtient ce résultat parce que la dernière ligne de la méthode est
&lt;code&gt;params[:phrase].reverse&lt;/code&gt;. Et si vous vous souvenez bien, la
dernière ligne d'une méthode est ce qui est renvoyé pour l'URL demandée.
&lt;code&gt;params[:phrase]&lt;/code&gt; correspond au texte entré dans le formulaire et le
&lt;code&gt;.reverse&lt;/code&gt; à sa suite correspond à la méthode &amp;quot;reverse&amp;quot; pour les
chaines de caractères. Et cette méthode fait exactement ce que son nom laisse
supposer, soit inverser l'ordre des caractères d'une phrase. Coup de bol, c'est
aussi ce à quoi notre application était destinée !&lt;/p&gt;
&lt;h3&gt;Faire un postback&lt;/h3&gt;
&lt;p&gt;On peut pousser le bouchon encore plus loin et utiliser la même URL pour nos
deux pages (l'affichage du formulaire et l'affichage du résultat de notre
application). C'est possible parce que pour afficher le formulaire on fait une
requête GET et que pour inverser le texte on envoie le formulaire avec une
requête POST. Par conséquent, on peut donc gérer ces deux actions avec la même
route, mais deux actions différentes.&lt;/p&gt;
&lt;p&gt;On peut donc réécrire &amp;quot;main.rb&amp;quot; :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Enter Your text here&amp;quot;
  erb :home
end

post '/' do
  @title = &amp;quot;Here's Your Reversed Text:&amp;quot;
  params[:phrase].reverse
end
&lt;/pre&gt;
&lt;p&gt;Cette fois-ci, l'URL de la route est toujours la même, mais la méthode HTTP
est différente (soit un GET, soit un POST). Le fait de poster vers soit-même
s'appelle un &amp;quot;postback&amp;quot;. En plus du GET et du POST, Sinatra gère les deux
autres méthodes HTTP, à savoir PUT et DELETE. Nous n'en avons pas besoin pour
cette application, mais nous aurons l'occasion d'y revenir dans un autre
projet.&lt;/p&gt;
&lt;p&gt;Pour que le postback fonctionne, il faut aussi penser à modifier l'attribut
action du formulaire au niveau de la vue &amp;quot;home.erb&amp;quot; pour qu'il pointe vers la
même URL :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;form action=&amp;quot;/&amp;quot; method =&amp;quot;post&amp;quot; accept-charset=&amp;quot;utf-8&amp;quot;&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;phrase&amp;quot; name=&amp;quot;phrase&amp;quot; value=&amp;quot;Write something...&amp;quot;&amp;gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;...and reverse it!&amp;quot;&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Et comme pour l'instant le résultat de notre application se présente
seulement sous la forme d'une ligne de texte, on va enjoliver ça en créant une
nouvelle vue &amp;quot;reverse.erb&amp;quot; qui va nous permettre d'afficher ce résultat de
façon un peu plus élégante :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;h3&amp;gt;Here is your reversed text......&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;%= @reversed_text %&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Il suffit alors de référencer cette vue dans le fichier &amp;quot;main.rb&amp;quot;, dans
lequel nous initialisons la variable session &amp;quot;@reversed_text&amp;quot; que nous avons
utilisée dans notre nouvelle vue :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Enter Your text here&amp;quot;
  erb :home
end

post '/' do
  @title = &amp;quot;Here's Your Reversed Text:&amp;quot;
  @reversed_text = params[:phrase].reverse
  erb :reverse
end
&lt;/pre&gt;
&lt;p&gt;Si on relance tout et que l'on fait tout bien comme il faut, on arrive sur
l'écran suivant :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-8.png&quot; alt=&quot;reverse-8.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Les paramètres nommés&lt;/h3&gt;
&lt;p&gt;On pourrait en rester là puisque l'application fait ce qui était prévu. Mais
on peut faire mieux, comme par exemple permettre à l'utilisateur d'indiquer la
phrase qu'il veut inverser directement au niveau de l'URL. OK, mais comment
faire pour retrouver le texte qui a été proposé ? Pas compliqué, il faut
juste ajouter une route avec un paramètre nommé :&lt;/p&gt;
&lt;pre&gt;
get '/:phrase' do
&lt;/pre&gt;
&lt;p&gt;Cela va ajouter automatiquement un paramètre &amp;quot;phrase&amp;quot; à la collection
&amp;quot;params&amp;quot;. On retrouvera donc tout ce que l'utilisateur aura indiqué dans l'URL
en utilisant params[:phrase]. Par exemple, pour l'URL
http://localhost:4567/frank on aura params[:phrase] égal à &amp;quot;frank&amp;quot; et pour
l'URL http://localhost:4567/sinatra on aura params[:phrase] égal à &amp;quot;sinatra&amp;quot;
.&lt;/p&gt;
&lt;p&gt;On va donc compléter notre fichier &amp;quot;main.rb&amp;quot; pour lui ajouter du code
destiné à gérer cette route :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'

get '/' do
  @title = &amp;quot;Enter Your text here&amp;quot;
  erb :home
end

post '/' do
  @title = &amp;quot;Here's Your Reversed Text:&amp;quot;
  @reversed_text = params[:phrase].reverse
  erb :reverse
end

get '/:phrase' do
  @title = &amp;quot;Here's Your Reversed Text:&amp;quot;
  @reversed_text = params[:phrase].reverse
  erb :reverse
end
&lt;/pre&gt;
&lt;p&gt;Voyons voir si ça marche. Tout ce qu'il y a à faire (après avoir relancé le
serveur pour la dernière fois), c'est d'appeler l'URL http://localhost:4567/
suivi d'une phrase de votre choix et de vérifier que ce texte s'affiche bien à
l'envers, comme dans la copie d'écran ci-dessous :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.pagesd.info/public/Sinatra/reverse-9.png&quot; alt=&quot;reverse-9.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Voilà c'est fini&lt;/h3&gt;
&lt;p&gt;Et ainsi se termine le tutoriel consacré à la première application Sinatra
proposée par Darren Jones (&lt;a href=&quot;http://twitter.com/daz4126&quot; hreflang=&quot;us&quot;&gt;@daz4126&lt;/a&gt;) dont ce billet constitue une traduction très très libre.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/27/creation-premier-projet-sinatra#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/27/creation-premier-projet-sinatra#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/535557</wfw:commentRss>
      </item>
    
  <item>
    <title>Contexte d'une recherche Exalead SDK</title>
    <link>http://blog.pagesd.info/post/2010/07/26/contexte-recherche-exalead-sdk</link>
    <guid isPermaLink="false">urn:md5:d9381a36810de722a26f1a8dfcd50cb5</guid>
    <pubDate>Mon, 26 Jul 2010 16:50:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>boulot</category><category>c-sharp</category>    
    <description>    &lt;p&gt;Quoiqu'en dise la documentation, il ne faut &lt;strong&gt;surtout&lt;/strong&gt; pas
utiliser la forme :&lt;/p&gt;
&lt;pre&gt;
searchQuery.SearchContext = mon_contexte;
&lt;/pre&gt;
&lt;p&gt;Mais &lt;strong&gt;obligatoirement&lt;/strong&gt; la syntaxe :&lt;/p&gt;
&lt;pre&gt;
searchQuery.AddParameter(&amp;quot;C&amp;quot;, mon_contexte);
&lt;/pre&gt;
&lt;p&gt;En tout cas avec Exalead one:enterprise 4.6.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/26/contexte-recherche-exalead-sdk#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/26/contexte-recherche-exalead-sdk#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/535334</wfw:commentRss>
      </item>
    
  <item>
    <title>Et de deux</title>
    <link>http://blog.pagesd.info/post/2010/07/26/et-de-deux</link>
    <guid isPermaLink="false">urn:md5:e5e991709c80a936ecabc8c6b0db8191</guid>
    <pubDate>Mon, 26 Jul 2010 13:55:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category><category>Tutoriel</category>    
    <description>    &lt;blockquote&gt;
&lt;p&gt;You’ve virtually completed the public-facing portion of SportsStore. (...)
The well-separated architecture means you can easily change the behavior of any
application piece (e.g., what happens when an order is submitted, or the
definition of a valid shipping address) in one obvious place without worrying
about inconsistencies or subtle, indirect consequences. You could easily change
your database schema without having to change the rest of the application (just
change the LINQ to SQL mappings).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.stevensanderson.com/&quot; hreflang=&quot;us&quot;&gt;Steven
Sanderson&lt;/a&gt; - &lt;a href=&quot;http://www.amazon.fr/gp/product/1430228865?ie=UTF8&amp;amp;tag=07arde-21&amp;amp;linkCode=as2&amp;amp;camp=1642&amp;amp;creative=6746&amp;amp;creativeASIN=1430228865&quot;&gt;
Pro Asp.net Mvc V2 Framework&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/26/et-de-deux#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/26/et-de-deux#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/535276</wfw:commentRss>
      </item>
    
  <item>
    <title>Tout vient à point à qui peut attendre</title>
    <link>http://blog.pagesd.info/post/2010/07/23/tout-vient-a-point-a-qui-peut-attendre</link>
    <guid isPermaLink="false">urn:md5:aca005c24fcedca51c23b340f64d3ee0</guid>
    <pubDate>Fri, 23 Jul 2010 09:03:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category><category>Tutoriel</category>    
    <description>    &lt;blockquote&gt;
&lt;p&gt;In this chapter, you built most of the core infrastructure needed for the
SportsStore application. It doesn’t yet have many features you could show off
to your boss or client, but behind the scenes you’ve got the beginnings of a
domain model, with a product repository backed by a SQL Server database.
There’s a single MVC controller, ProductsController, that can produce a paged
list of products, and there’s a DI container that coordinates the dependencies
between all these pieces. Plus, there’s a clean custom URL schema, and you’re
now starting to build the application code on a solid foundation of unit
tests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.stevensanderson.com/&quot; hreflang=&quot;us&quot;&gt;Steven
Sanderson&lt;/a&gt; - &lt;a href=&quot;http://www.amazon.fr/gp/product/1430228865?ie=UTF8&amp;amp;tag=07arde-21&amp;amp;linkCode=as2&amp;amp;camp=1642&amp;amp;creative=6746&amp;amp;creativeASIN=1430228865&quot;&gt;
Pro Asp.net Mvc V2 Framework&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/23/tout-vient-a-point-a-qui-peut-attendre#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/23/tout-vient-a-point-a-qui-peut-attendre#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/534756</wfw:commentRss>
      </item>
    
  <item>
    <title>Installer Sinatra sous Windows 7</title>
    <link>http://blog.pagesd.info/post/2010/07/22/Installer-Sinatra-sous-Windows-7</link>
    <guid isPermaLink="false">urn:md5:0e880683cbdedaa79225a03953ff4390</guid>
    <pubDate>Thu, 22 Jul 2010 13:47:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category><category>Ruby</category><category>Sinatra</category><category>Tutoriel</category>    
    <description>    &lt;p&gt;Je suis tombé sur une super série de tutoriels pour apprendre à utiliser
Sinatra. C'est le résultat de la bonne résolution de Daz (Darren Jones) pour
l'année 2010 et ça s'appelle &lt;a href=&quot;http://ididitmyway.heroku.com/&quot; hreflang=&quot;us&quot;&gt;I Dit It My Way ou &amp;quot;The Sinatra Songbook Project&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;C'est l'occasion pour se mettre à &lt;a href=&quot;http://www.sinatrarb.com/&quot; hreflang=&quot;us&quot;&gt;Sinatra&lt;/a&gt; et je me suis donc lancé dans l'installation des
outils nécessaires à son utilisation, en suivant un des premiers
tutoriels : &lt;a href=&quot;http://ididitmyway.heroku.com/past/2010/1/10/installing_sinatra/&quot; hreflang=&quot;us&quot;&gt;Installing Sinatra&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Installer Ruby sur Windows&lt;/h3&gt;
&lt;p&gt;il faut commencer par installer Ruby étant donné que ce n’est pas quelque
chose de déjà présent sur mon PC. C’est pas compliqué du tout. Il suffit
d’utiliser &lt;a href=&quot;http://rubyinstaller.org/&quot; hreflang=&quot;us&quot;&gt;RubyInstaller pour
Windows&lt;/a&gt; (la façon la plus simple d’installer Ruby sous Windows) qui va
s’occuper de tout.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cliquer sur le gros bouton rouge « Download » sur la page
d’accueil&lt;/li&gt;
&lt;li&gt;Sélectionner la version la plus récente de RubyInstallers (soit Ruby
1.9.1-p429 à ce jour)&lt;/li&gt;
&lt;li&gt;Enregistrer le fichier sur le disque dur (soit dans le répertoire C:\Temp
dans mon cas)&lt;/li&gt;
&lt;li&gt;Double-cliquer sur C:\Temp\rubyinstaller-1.9.1-p429.exe pour lancer
l’installation&lt;/li&gt;
&lt;li&gt;Le seul truc un peu important, c’est de demander à faire l’installation
dans C:\Ruby (et pas C:\Ruby191 comme le propose l’installeur) et de cocher les
choix « Add Ruby executables to your PATH » et « Associate .rb
and .rbw files with this Ruby installation ».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’installation est très rapide et au final on se retrouve avec un répertoire
« C:\Ruby » d’une cinquantaine de méga.&lt;/p&gt;
&lt;h3&gt;Installer Sinatra sur Windows&lt;/h3&gt;
&lt;p&gt;On entre ensuite dans le vif du sujet qui consiste à installer Sinatra. Pour
cela, il faut ouvrir une « Invite de commandes » et aller dans le
répertoire « C:\Ruby » et lancer la commande suivante :&lt;/p&gt;
&lt;pre&gt;
C:\Ruby&amp;gt;gem install sinatra
&lt;/pre&gt;
&lt;p&gt;Ce qui donne presque aussitôt :&lt;/p&gt;
&lt;pre&gt;
Successfully installed rack-1.2.1
Successfully installed sinatra-1.0
2 gems installed
Installing ri documentation for rack-1.2.1...
Installing ri documentation for sinatra-1.0...
Updating class cache with 0 classes...
Installing RDoc documentation for rack-1.2.1...
Installing RDoc documentation for sinatra-1.0...

C:\Ruby&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Ca y est, mon PC devrait contenir Ruby + Sinatra !&lt;/p&gt;
&lt;h3&gt;Créer une première application Sinatra&lt;/h3&gt;
&lt;p&gt;On va alors pouvoir tester que ça marche en codant notre toute première
application Sinatra. Pour cela, il suffit d'ouvrir Notepad pour créer le
fichier C:\Ruby\test.rb avec le code suivant :&lt;/p&gt;
&lt;pre&gt;
require 'rubygems'
require 'sinatra'
get '/hi' do
  &amp;quot;I Did It My Way!&amp;quot;
end
&lt;/pre&gt;
&lt;p&gt;Puis on demande à Ruby d’exécuter ce programme :&lt;/p&gt;
&lt;pre&gt;
C:\Ruby&amp;gt;ruby test.rb
&lt;/pre&gt;
&lt;p&gt;Ce qui donne :&lt;/p&gt;
&lt;pre&gt;
== Sinatra/1.0 has taken the stage on 4567 for development with backup from WEBrick
[2010-07-22 12:07:23] INFO  WEBrick 1.3.1
[2010-07-22 12:07:23] INFO  ruby 1.9.1 (2010-07-02) [i386-mingw32]
[2010-07-22 12:07:23] INFO  WEBrick::HTTPServer#start: pid=952 port=4567
&lt;/pre&gt;
&lt;p&gt;Ca marche ! Il ne reste plus qu’à lancer un des navigateurs installé
sur le PC pour aller voir ce que donne l’adresse
« http://localhost:4567/hi ». Et là, je retrouve bien le message attendu,
à savoir « I Dit It My Way ! ».&lt;/p&gt;
&lt;p&gt;C’est magnifique ! Tout fonctionne comme prévu. Il n'y a qu'à arrêter
l'exécution du programme test.rb par un simple Ctrl-C et se préparer pour la
suite des tutoriels...&lt;/p&gt;
&lt;pre&gt;
== Sinatra has ended his set (crowd applauds)
[2010-07-22 12:10:43] INFO  going to shutdown ...
[2010-07-22 12:10:43] INFO  WEBrick::HTTPServer#start done.
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/22/Installer-Sinatra-sous-Windows-7#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/22/Installer-Sinatra-sous-Windows-7#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/534613</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 16/07/2010</title>
    <link>http://blog.pagesd.info/post/2010/07/19/Blogmarks-du-16/07/2010</link>
    <guid isPermaLink="false">urn:md5:f56aa209dd637a6b0d50d14e2ac090a3</guid>
    <pubDate>Mon, 19 Jul 2010 10:39:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://fabiomaulo.blogspot.com/2010/05/from-svn-to-mercurial-in-windows7.html&quot;&gt;
From SVN to Mercurial (in Windows7)&lt;/a&gt; : Explications sur la façon de migrer
un repository Subversion vers Mercurial&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/subversion&quot;&gt;subversion&lt;/a&gt; - &lt;a href=&quot;http://www.blogmarks.net/marks/tag/git&quot;&gt;git&lt;/a&gt; - &lt;a href=&quot;http://www.blogmarks.net/marks/tag/mercurial&quot;&gt;mercurial&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/19/Blogmarks-du-16/07/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/19/Blogmarks-du-16/07/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/533872</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 05/07/2010</title>
    <link>http://blog.pagesd.info/post/2010/07/06/Blogmarks-du-05/07/2010</link>
    <guid isPermaLink="false">urn:md5:40196fe387cbca44236b84b29ac417ad</guid>
    <pubDate>Tue, 06 Jul 2010 14:37:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/c63F55&quot;&gt;TekPub - MVC Music Store&lt;/a&gt; : L'application
MVC Music Store refactorisée par Rob Conery dans le cadre de la série consacrée
à Entity Framework sur TekPub&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/mvc&quot;&gt;mvc&lt;/a&gt; -
&lt;a href=&quot;http://www.blogmarks.net/marks/tag/developpement&quot;&gt;developpement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/06/Blogmarks-du-05/07/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/06/Blogmarks-du-05/07/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/531769</wfw:commentRss>
      </item>
    
  <item>
    <title>Data annotation belong to View models</title>
    <link>http://blog.pagesd.info/post/2010/07/02/data-annotation-belong-to-view-models</link>
    <guid isPermaLink="false">urn:md5:6e8d95f1c9e3cf0c64c8b20f46cb1139</guid>
    <pubDate>Fri, 02 Jul 2010 09:43:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category>    
    <description>    &lt;blockquote&gt;
&lt;p&gt;Personally, my recommendation for people who want strict SoC (like I do) is
to use ViewModels and only place the annotations on the view model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html&quot; hreflang=&quot;us&quot;&gt;ASP.NET MVC 2 Templates, Part 4: Custom Object Templates&lt;/a&gt;, via
&lt;a href=&quot;http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/&quot; hreflang=&quot;us&quot;&gt;The Big Boy MVC Series&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/02/data-annotation-belong-to-view-models#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/02/data-annotation-belong-to-view-models#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/530975</wfw:commentRss>
      </item>
    
  <item>
    <title>View models belong to Web-project</title>
    <link>http://blog.pagesd.info/post/2010/07/02/view-models-belong-to-web-project</link>
    <guid isPermaLink="false">urn:md5:81d1e11c9007e69286efb61631ff6c70</guid>
    <pubDate>Fri, 02 Jul 2010 09:27:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>MVC</category>    
    <description>    &lt;blockquote&gt;
&lt;p&gt;In an ASP.NET MVC application the view models belong to the Web-project,
they are not part of the domain model. Usually a view model belongs to a single
controller, and its views.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bengtbe.com/blog/post/2009/04/14/Using-AutoMapper-to-map-view-models-in-ASPNET-MVC.aspx&quot; hreflang=&quot;us&quot;&gt;Using AutoMapper to map view models in ASP.NET MVC&lt;/a&gt;, via
&lt;a href=&quot;http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/&quot; hreflang=&quot;us&quot;&gt;The Big Boy MVC Series&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/07/02/view-models-belong-to-web-project#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/07/02/view-models-belong-to-web-project#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/530968</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 29/06/2010</title>
    <link>http://blog.pagesd.info/post/2010/06/30/Blogmarks-du-29/06/2010</link>
    <guid isPermaLink="false">urn:md5:2f3c0b6b2df852b0f8b04ed84851d3e1</guid>
    <pubDate>Wed, 30 Jun 2010 08:19:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.nuclex.org/downloads/tools/39-nunit-template-for-asp-net-mvc-2&quot;&gt;NUnit
Template for ASP.NET MVC 2.0&lt;/a&gt; : Un template pour gérer des projets de test
unitaires NUnit dans Visual Studio 2010&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/.net&quot;&gt;.net&lt;/a&gt; -
&lt;a href=&quot;http://www.blogmarks.net/marks/tag/mvc&quot;&gt;mvc&lt;/a&gt; - &lt;a href=&quot;http://www.blogmarks.net/marks/tag/nunit&quot;&gt;nunit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/06/30/Blogmarks-du-29/06/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/06/30/Blogmarks-du-29/06/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/530469</wfw:commentRss>
      </item>
    
  <item>
    <title>Activer l'intellisense pour le mapping NHibernate dans Visual Studio</title>
    <link>http://blog.pagesd.info/post/2010/06/23/intellisense-mapping-nhibernate-visual-studio</link>
    <guid isPermaLink="false">urn:md5:961fe63278f6492a73e9efab7bff8196</guid>
    <pubDate>Wed, 23 Jun 2010 14:51:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>.net</category><category>NHibernate</category>    
    <description>    &lt;p&gt;Pour que Visual Studio propose l'intellisence quand on édite les fichier de
configuration ou de mapping de NHibernate, il faut définir la propriété
&amp;quot;Schema&amp;quot; pour qu'elle pointe sur le fichier &amp;quot;nhibernate-mapping.xsd&amp;quot; ou
&amp;quot;nhibernate-configuration.xsd&amp;quot;.&lt;/p&gt;
&lt;p&gt;Mais plutôt que de faire ça à la main, il est beaucoup plus simple de
référencer ces deux fichiers une bon une fois pour toute au niveau de Visual
Studio. Pour cela, il suffit de copier les fichiers &amp;quot;nhibernate-mapping.xsd&amp;quot; et
&amp;quot;nhibernate-configuration.xsd&amp;quot; dans le répertoire destiné à contenir les
schémas pour Visual Studio. Généralement (en tout cas dans mon cas), ce
répertoire est : C:\Program Files (x86)\Microsoft Visual Studio
9.0\Xml\Schemas.&lt;/p&gt;
&lt;p&gt;Et c'est tout (à moins qu'il m'ai fallu relancer Visual Studio ?).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/06/23/intellisense-mapping-nhibernate-visual-studio#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/06/23/intellisense-mapping-nhibernate-visual-studio#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/529120</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 18/06/2010</title>
    <link>http://blog.pagesd.info/post/2010/06/21/Blogmarks-du-18/06/2010</link>
    <guid isPermaLink="false">urn:md5:44862581b4066355bf087a9d0adcfc1f</guid>
    <pubDate>Mon, 21 Jun 2010 10:44:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.rebeccamurphey.com/2010/06/17/open-source-jquery-training/&quot;&gt;Announcing
jQuery Fundamentals: An Open-Source jQuery Training Curriculum&lt;/a&gt; : Un petit
manuel d'apprentissage pour jQuery mis au point par Rebecca Murphey au fur et à
mesure des formations qu'elle donne sur le développement avec jQuery&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/javascript&quot;&gt;javascript&lt;/a&gt; - &lt;a href=&quot;http://www.blogmarks.net/marks/tag/jQuery&quot;&gt;jQuery&lt;/a&gt; - &lt;a href=&quot;http://www.blogmarks.net/marks/tag/developpement&quot;&gt;developpement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/06/21/Blogmarks-du-18/06/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/06/21/Blogmarks-du-18/06/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/528537</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 17/06/2010</title>
    <link>http://blog.pagesd.info/post/2010/06/18/Blogmarks-du-17/06/2010</link>
    <guid isPermaLink="false">urn:md5:688f5db48f4ba0076c0b563ce0a5922d</guid>
    <pubDate>Fri, 18 Jun 2010 08:42:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.arrangeactassert.com/asp-net-mvc-view-best-practices-keep-logic-out-of-your-views/&quot;&gt;
ASP.NET MVC View Best Practices – Keep logic out of your views&lt;/a&gt; :
Présentation de 4 méthodes différentes pour éviter d'avoir à gérer du code (et
en particulier des conditions) dans les vues&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/.net&quot;&gt;.net&lt;/a&gt; -
&lt;a href=&quot;http://www.blogmarks.net/marks/tag/mvc&quot;&gt;mvc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.pagesd.info/post/2010/06/18/Blogmarks-du-17/06/2010#comment-form</comments>
      <wfw:comment>http://blog.pagesd.info/post/2010/06/18/Blogmarks-du-17/06/2010#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pagesd.info/feed/atom/comments/527885</wfw:commentRss>
      </item>
    
  <item>
    <title>Blogmarks du 09/06/2010</title>
    <link>http://blog.pagesd.info/post/2010/06/10/Blogmarks-du-09/06/2010</link>
    <guid isPermaLink="false">urn:md5:790a11280904454454c666e58e735a03</guid>
    <pubDate>Thu, 10 Jun 2010 16:17:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Blogmarks</category>    
    <description>    &lt;ul class=&quot;bm_list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.codeproject.com/KB/aspnet/ASP_NET_MVC_WITH_EF.aspx&quot;&gt;Architecture
Guide: ASP.NET MVC + N-tier + Entity Framework and Many More&lt;/a&gt; : Un article
très complet qui explique comment architecturer une petite application de
gestion de documents en ASP.NET MVC&lt;/p&gt;
&lt;p class=&quot;bm_tags&quot;&gt;&lt;a href=&quot;http://www.blogmarks.net/marks/tag/.net&quot;&gt;.net&lt;/a&gt; -
&lt;a href=&quot;http://www.blogmarks.net/marks/tag/developpement&quot;&gt;developpement&lt;/a&gt; -
&lt;a href=&quot;http://www.blogmarks.net/marks/tag/mvc&quot;&gt;mvc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>MVC Music Store / Raven DB : StoreManagerController (2° partie)</title>
    <link>http://blog.pagesd.info/post/2010/06/01/mvc-music-store-raven-db-storemanagercontroller-2</link>
    <guid isPermaLink="false">urn:md5:6f4614352280f4dfecf936b09b377eda</guid>
    <pubDate>Tue, 01 Jun 2010 18:40:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Traductions</category>
        <category>.net</category><category>MVC</category><category>NoSQL</category><category>RavenDB</category><category>Traduction</category><category>Tutoriel</category>    
    <description>    &lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://ayende.com/Blog/archive/2010/05/31/porting-mvc-music-store-to-raven-storemanagercontroller-part-2.aspx&quot; hreflang=&quot;us&quot;&gt;Porting MVC Music Store to Raven: StoreManagerController, part
2&lt;/a&gt;&amp;quot;, le dernier de la série consacrée au portage de l'application MVC Music
Store sous RavenDB par Oren Eini, alias Ayende Rahien.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Le contrôleur StoreManagerController contient encore deux méthodes que nous
n'avons pas étudiées. Nous allons devoir les aborder de façon un peu
différente.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_E224/image_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Est-ce que vous devinez pourquoi ?&lt;/p&gt;
&lt;p&gt;C'est parce qu'au départ nous étions d'accord sur le fait qu'il n'y avait
aucune raison valable de gérer les artistes en tant que document spécifique.
Après tout, il ne s'agit que de données de référence. Sauf que maintenant nous
devons y faire référence.&lt;/p&gt;
&lt;p&gt;C'est sûr qu'on pourrait créer une série de documents artistes, ce qui
faciliterait énormément la migration du code :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_E224/image_thumb_1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mais je continue à penser que les artistes n'existent pas réellement en tant
qu'entité indépendante dans notre modèle. Par conséquent, au lieu de suivre
cette voie nous allons plutôt faire une projection.&lt;/p&gt;
&lt;p&gt;Nous commençons par définir un index &amp;quot;Artists&amp;quot; à l'aide des requêtes linq
map / reduce suivantes :&lt;/p&gt;
&lt;pre&gt;
// map 
from album in docs.Albums
select new { album.Artist.Id, album.Artist.Name }

// reduce 
from artist in results
group artist by new { artist.Id, artist.Name } into g
select new { g.Key.Id, g.Key.Name }
&lt;/pre&gt;
&lt;p&gt;Si vous regardez attentivement ce code, vous pouvez voir que sa
fonctionnalité principale est de faire un distinct sur l'ensemble des artistes
de tous les albums.&lt;/p&gt;
&lt;p&gt;Si bien que maintenant nous pouvons coder nos deux dernières méthodes comme
ceci :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_E224/image_thumb_2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Il faut bien comprendre un truc : ça ne coûte rien de faire des
requêtes avec Raven, parce que Raven ne permet les requêtes que sur des index
et que ces index sont créés en tache de fond, ce qui contribue à rendre les
requêtes très rapides.&lt;/p&gt;
&lt;p&gt;Et cela remet en cause la façon dont vous allez concevoir votre système et
de votre modèle de données. Avec Raven, vous cherchez à axer la plupart de vos
traitements sur des index et interroger ces index, parce que c'est ce qui est
le moins gourmand.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>MVC Music Store / Raven DB : StoreManagerController</title>
    <link>http://blog.pagesd.info/post/2010/05/31/mvc-music-store-raven-db-storemanagercontroller</link>
    <guid isPermaLink="false">urn:md5:3f5983d6d39965d949a3f003eda15a64</guid>
    <pubDate>Mon, 31 May 2010 21:46:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Traductions</category>
        <category>.net</category><category>MVC</category><category>NoSQL</category><category>RavenDB</category><category>Traduction</category><category>Tutoriel</category>    
    <description>    &lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://ayende.com/Blog/archive/2010/05/29/porting-mvc-music-store-to-raven-storemanagercontroller.aspx&quot; hreflang=&quot;us&quot;&gt;Porting MVC Music Store to Raven: StoreManagerController&lt;/a&gt;&amp;quot;, le
douzième de la série consacrée au portage de l'application MVC Music Store sous
RavenDB par Oren Eini, alias Ayende Rahien.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;La dernière partie du portage de MVC Music Store sous Raven concerne toute
la partie administration, implémentée au niveau du contrôleur
StoreManagerController. Je vais commencer par une rapide comparaison de toutes
les méthodes où le passage sous Raven n'apporte rien de nouveau puis je mettrai
l'accent sur une différence de conception plutôt intéressante entre les deux
implémentations.&lt;/p&gt;
&lt;h4&gt;Code d'origine&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Portage sous Raven&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb_1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le code pour Raven est beaucoup plus court pour la bonne et simple raison
que j'ai fait disparaitre tout la pseudo gestion d'erreur qu'il contenait.&lt;/p&gt;
&lt;h4&gt;Code d'origine&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb_5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Portage sous Raven&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb_6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Là encore, le fait de faire disparaitre une gestion d'erreur qui n'est là
que pour la gallerie a un impact plus que certain sur la taille du code.&lt;/p&gt;
&lt;h4&gt;Code d'origine&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb_7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Portage sous Raven&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenStoreManagerC_DCF0/image_thumb_8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ici nous avons une différence plus intéressante. Le code d'origine a pour
effet d'effacer les commandes qui contiennent l'album supprimé. Ce que ne fait
pas le code porté sous Raven.&lt;/p&gt;
&lt;p&gt;La notion d'intégrité référentielle n'existe pas sous Raven (ou de façon
plus générale sous les bases de données document). Cela peut être un avantage
ou un inconvénient. Mais dans ce cas précis, cela s'avère être un avantage
puisque nous pouvons supprimer un album sans perdre de commandes. Je ne sais
pas pour vous, mais en ce qui me concerne ça ne me déplait pas de conserver
toutes mes commandes :)&lt;/p&gt;
&lt;p&gt;Avec Raven, les documents sont indépendants les uns des autres. Par
conséquent, le fait de modifier un document n'a aucun impact sur les autres
documents.&lt;/p&gt;
&lt;p&gt;Il reste encore deux méthodes à étudier en ce qui concerne le contrôleur
StoreManagerController, mais je verrai ça dans mon prochain billet.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>MVC Music Store / Raven DB : Gérer le règlement</title>
    <link>http://blog.pagesd.info/post/2010/05/30/mvc-music-store-raven-db-gerer-le-reglement</link>
    <guid isPermaLink="false">urn:md5:95ad836f994f153aad6bf57d8b601d5c</guid>
    <pubDate>Sun, 30 May 2010 17:41:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Traductions</category>
        <category>.net</category><category>MVC</category><category>NoSQL</category><category>RavenDB</category><category>Traduction</category><category>Tutoriel</category>    
    <description>    &lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://ayende.com/Blog/archive/2010/05/28/porting-mvc-music-store-to-raven-porting-the-checkout-process.aspx&quot; hreflang=&quot;us&quot;&gt;Porting MVC Music Store to Raven: Porting the checkout
process&lt;/a&gt;&amp;quot;, le onzième de la série consacrée au portage de l'application MVC
Music Store sous RavenDB par Oren Eini, alias Ayende Rahien.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Dans MVC Music Store, la gestion du règlement est composée de deux
parties : renseigner l'adresse et le mode de paiement puis terminer la
commande.&lt;/p&gt;
&lt;p&gt;Le code pour gérer l'adresse et le mode de paiement dans la version
d'origine :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenPortingtheche_D900/image_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et ce même code correspondant à la version portée sous Raven :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenPortingtheche_D900/image_thumb_1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, ils sont presque identiques. Mais le code
pour Raven n'est pas tout à fait complet.&lt;/p&gt;
&lt;p&gt;Si vous vous souvenez, nous avions décidé de stocker une propriété CountSold
dans le document Album, pour pouvoir plus facilement faire un classement en
fonction de ce compteur. Il nous reste donc à réaliser l'incrémentation de ce
compteur, ce que j'ai codé immédiatement après l'appel à CreateOrder :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenPortingtheche_D900/image_thumb_2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le truc essentiel dans ce code, c'est que nous avons chargé tous les
documents albums en une seule requête. Et lorsque nous sauvegardons, Raven va
effectuer un seul appel (batch) au serveur.&lt;/p&gt;
&lt;p&gt;Et maintenant, pour être tout à fait complet, voyons ce que donnait la
méthode Complete() :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenPortingtheche_D900/image_thumb_3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et dans la nouvelle version sous Raven :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingMVCMusicStoretoRavenPortingtheche_D900/image_thumb_4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Je pense qu'arrivé à ce point, vous êtes en mesure de comprendre comment
fonctionne les deux versions.&lt;/p&gt;
&lt;p&gt;Mon prochain billet concernera la partie administration de
l'application.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>MVC Music Store / Raven DB : ShoppingCartController</title>
    <link>http://blog.pagesd.info/post/2010/05/28/mvc-music-store-raven-db-shoppingcartcontroller</link>
    <guid isPermaLink="false">urn:md5:c00ee2004744a11b5c8d829272bc36ae</guid>
    <pubDate>Fri, 28 May 2010 13:15:00 +0200</pubDate>
    <dc:creator>Michel</dc:creator>
        <category>Traductions</category>
        <category>.net</category><category>MVC</category><category>NoSQL</category><category>RavenDB</category><category>Traduction</category><category>Tutoriel</category>    
    <description>    &lt;div class=&quot;encart&quot;&gt;
&lt;p&gt;Ceci est la traduction du billet &amp;quot;&lt;a href=&quot;http://ayende.com/Blog/archive/2010/05/27/porting-the-mvc-music-store-to-raven-shoppingcartcontroller.aspx&quot; hreflang=&quot;us&quot;&gt;Porting MVC Music Store to Raven: ShoppingCart&lt;/a&gt;&amp;quot;, le dixième
de la série consacrée au portage de l'application MVC Music Store sous RavenDB
par Oren Eini, alias Ayende Rahien.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Le contrôleur ShoppingCartController est considérablement impacté par tous
les changements que nous avons apportés à la classe ShoppingCart. Penchons-nous
sur ces modifications, en commençant par l'action Index() dans le code
d'origine :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Celui-ci exécute deux requêtes différentes pour gérer la commande alors que
la version pour Raven exécute seulement une requête au niveau de la méthode
FindShoppingCart () :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ce code implémente seulement la logique pour charger le panier depuis Raven
ou créer un nouveau panier (pour l'identifiant spécifié). Notez-bien que nous
n'enregistrons pas le nouveau panier dans la base de données, mais associons
seulement ce nouveau panier avec la session. Nous n'avons pas besoin de
sauvegarder étant donné que pour l'instant il ne contient rien de significatif.
Lorsque nous appellerons SaveChanges(), le nouveau panier sera envoyé vers
Raven pour stockage.&lt;/p&gt;
&lt;p&gt;Maintenant, voyons-voir l'action AddToChart d'origine :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et la version portée sous Raven :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Elles sont très similaires, si ce n'est que dans le cas de Raven, la méthode
AddToCart() de la classe ShoppingCart est uniquement concerné par l'ajout d'un
nouvel article au panier ou par la mise à jour de la quantité d'un article
existant. Ainsi, il n'y a absolument aucun accès à la base de données dans la
version pour Raven de la méthode ShoppingCart.AddToCart().&lt;/p&gt;
&lt;p&gt;La différence c'est donc que dans l'approche pour Raven, nous appelons la
méthode session.SaveChanges() au niveau de l'action. Pour la bonne et simple
raison que c'est le bon endroit où faire cela étant donné que le code appelant
est en charge de l'environnent, y compris la sauvegarde lorsque cela est
nécessaire.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Je pense que le code pour Raven est plutôt facile à suivre. Il y a juste un
truc un peu étrange à faire remarquer au niveau de la dernière ligne :
id.Split(). Pourquoi diable fait-on ça ?&lt;/p&gt;
&lt;p&gt;Et bien c'est parce que Raven utilise des identifiants de la forme
&amp;quot;albums/616&amp;quot; et que la valeur DeleteId sera utilisé par le code Javascript
appelant pour retrouver un élément à partir de son identifiant. Et comme
l'identifiant d'un élément HTML ne peut pas contenir de &amp;quot;/&amp;quot;, nous ne renvoyons
que la partie numérique de l'identifiant. Ce n'est pas un problème puisque dans
ce cas précis nous ne gérons que des albums.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/PortingtheMVCMusicStoretoRavenShoppingCa_B3D7/image_thumb_10.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Encore une fois, on ne peut pas faire plus simple. Par conséquent, je ferai
seulement remarquer qu'avec l'approche suivie par Raven on peut profiter du
cache de l'unit of work alors qu'avec le code d'origine non.&lt;/p&gt;
&lt;p&gt;Dans mon prochain billet, je m'occuperai de la gestion de la commande.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>