<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rails on Marcello Barnaba</title>
    <link>https://sindro.me/it/tags/rails/</link>
    <description>Recent content in Rails on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sun, 06 Mar 2011 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/tags/rails/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Roma RSC 2011</title>
      <link>https://sindro.me/it/posts/2011-03-06-rome-rsc-2011/</link>
      <pubDate>Sun, 06 Mar 2011 18:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2011-03-06-rome-rsc-2011/</guid>
      <description>&lt;p&gt;Grazie agli sforzi di &lt;a href=&#34;http://twitter.com/jodosha&#34; target=&#34;_blank&#34;&gt;@jodosha&lt;/a&gt; e sulla scia del&#xA;vecchio evento &lt;del&gt;Javaday&lt;/del&gt;, ora ribattezzato &lt;a href=&#34;http://codemotion.it/&#34; target=&#34;_blank&#34;&gt;codemotion&lt;/a&gt;&#xA;che ha portato a Roma tanti sviluppatori Ruby da Milano, Padova e altre parti&#xA;d&amp;rsquo;Italia — il primo Ruby Social Club &lt;em&gt;ufficiale&lt;/em&gt; a Roma è stato un gran&#xA;successo. Ovviamente, l&amp;rsquo;&lt;em&gt;ufficialità&lt;/em&gt; si misura &lt;strong&gt;solo&lt;/strong&gt; nella quantità di spam&#xA;su Twitter postato a riguardo! :-): i precedenti RSC a Roma &lt;a href=&#34;http://ruby-it.org/pages/Primo&amp;#43;incontro&amp;#43;del&amp;#43;Ruby&amp;#43;Social&amp;#43;Club&amp;#43;a&amp;#43;Roma&#34; target=&#34;_blank&#34;&gt;risalgono al&#xA;2006&lt;/a&gt;&#xA;organizzati dagli attuali membri di &lt;a href=&#34;http://mikamai.com/&#34; target=&#34;_blank&#34;&gt;mikamai&lt;/a&gt; e altri&#xA;meetup promossi da &lt;a href=&#34;http://twitter.com/jeko&#34; target=&#34;_blank&#34;&gt;@jeko&lt;/a&gt; &lt;a href=&#34;https://www.ruby-forum.com/search?query=ruby&amp;#43;social&amp;#43;club&amp;#43;roma&#34; target=&#34;_blank&#34;&gt;nel&#xA;2007&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Quello che conta è che c&amp;rsquo;è una community, c&amp;rsquo;è passione, e c&amp;rsquo;è voglia di&#xA;condividere conoscenza — non importa chi organizza gli incontri, l&amp;rsquo;importante è&#xA;che si facciano :-).&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;evento è stato semplice e diretto — prima qualche birra, poi la mia&#xA;presentazione su RVM e gli interpreti Ruby, poi quella di Luca che ha annunciato&#xA;il suo progetto &lt;a href=&#34;http://minege.ms/&#34; target=&#34;_blank&#34;&gt;minege.ms&lt;/a&gt; e dopo il &lt;strong&gt;vero&lt;/strong&gt; social&#xA;networking :-). Ho rivisto &lt;a href=&#34;http://twitter.com/gravityblast&#34; target=&#34;_blank&#34;&gt;@gravityblast&lt;/a&gt; dopo&#xA;tanto che non ci vedevamo, ho conosciuto il gruppo&#xA;&lt;a href=&#34;http://programmersinpadua.it/&#34; target=&#34;_blank&#34;&gt;PIP&lt;/a&gt; e ho incontrato&#xA;&lt;a href=&#34;http://twitter.com/svarione&#34; target=&#34;_blank&#34;&gt;@svarione&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/punkmanit&#34; target=&#34;_blank&#34;&gt;@punkmanit&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/leonardoperna&#34; target=&#34;_blank&#34;&gt;@leonardoperna&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/riggasconi&#34; target=&#34;_blank&#34;&gt;@riggasconi&lt;/a&gt;,&#xA;&lt;a href=&#34;http://twitter.com/ogeidix&#34; target=&#34;_blank&#34;&gt;@ogeidix&lt;/a&gt; e altre persone in gamba. Inoltre,&#xA;abbiamo passato del gran bel tempo insieme, mettendo su un weekend davvero&#xA;sgangherato e divertente. Ovviamente, enormi kudos alla macchina di&#xA;&lt;a href=&#34;http://twitter.com/nhaima&#34; target=&#34;_blank&#34;&gt;@nhaima&lt;/a&gt; — che ci ha instancabilmente portato in&#xA;giro per Roma per due giorni :-)&lt;/p&gt;&#xA;&lt;p&gt;Ora, in attesa del prossimo meetup, &lt;strong&gt;grazie&lt;/strong&gt; a tutti quelli che hanno&#xA;partecipato, che mi hanno offerto birre e, ultimo ma non meno importante, grazie&#xA;a &lt;a href=&#34;http://twitter.com/etapeta&#34; target=&#34;_blank&#34;&gt;@etapeta&lt;/a&gt; per avermi portato in tempo&#xA;all&amp;rsquo;incontro — sei il vero eroe :-).&lt;/p&gt;&#xA;&lt;div style=&#34;width:100%; text-align:center;&#34;&gt; &lt;iframe&#xA;src=&#34;https://www.slideshare.net/slideshow/embed_code/key/MjVIa6uAKD9ASk&#34;&#xA;width=&#34;100%&#34; height=&#34;500&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34;&#xA;scrolling=&#34;no&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;/div&gt;</description>
    </item>
    <item>
      <title>Gli spin-off di Panmind presentati al Ruby Social Club Milano</title>
      <link>https://sindro.me/it/posts/2010-08-05-panmind-at-ruby-social-club/</link>
      <pubDate>Thu, 05 Aug 2010 16:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2010-08-05-panmind-at-ruby-social-club/</guid>
      <description>&lt;p&gt;Il 22 luglio 2010, &lt;a href=&#34;http://mikamai.com/&#34; target=&#34;_blank&#34;&gt;Mikamai&lt;/a&gt; ha ospitato un &lt;a href=&#34;http://blog.mikamai.com/2010/07/la-notte-del-ruby-social-club/&#34; target=&#34;_blank&#34;&gt;Ruby Social&#xA;Club a Milano&lt;/a&gt;,&#xA;dove circa 50 persone hanno assistito a cinque talk su Ruby, sviluppo web e&#xA;startup. Sono stato contento di essere uno degli speaker, e ho presentato un&#xA;insieme di plugin Rails che &lt;a href=&#34;http://mind2mind.is/&#34; target=&#34;_blank&#34;&gt;noi&lt;/a&gt; abbiamo estratto dal&#xA;nostro ultimo (e più grande) progetto:&#xA;&lt;a href=&#34;http://panmind.org/&#34; target=&#34;_blank&#34;&gt;Panmind&lt;/a&gt; (leggi di più nella &lt;a href=&#34;http://panmind.org/about&#34; target=&#34;_blank&#34;&gt;pagina&#xA;about&lt;/a&gt;), rilasciati come Open Source su&#xA;&lt;a href=&#34;http://github.com/Panmind&#34; target=&#34;_blank&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;La presentazione è divisa in due parti: la prima spiega &lt;strong&gt;perché&lt;/strong&gt; dovresti&#xA;seguire il sano principio di ingegneria del software di scrivere codice modulare&#xA;e a responsabilità separate, e poi &lt;strong&gt;come&lt;/strong&gt; potresti (e dovresti) estrarlo dalla&#xA;tua applicazione Rails disaccoppiando la configurazione e preparando il rilascio&#xA;Open Source, scrivendo documentazione &lt;strong&gt;E&lt;/strong&gt; presentando a un evento Ruby così,&#xA;&lt;strong&gt;si spera, qualcun altro scriverà i test unitari! :-)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Abbiamo rilasciato un plugin &lt;a href=&#34;http://github.com/panmind/ssl_helper&#34; target=&#34;_blank&#34;&gt;SSL helper&lt;/a&gt;&#xA;che implementa dei filtri (come &lt;code&gt;ssl_requirement&lt;/code&gt; di Rails) ma anche degli&#xA;helper per le named route: basta con &lt;code&gt;&amp;lt;%= url_for :protocol =&amp;gt; &#39;https&#39; %&amp;gt;&lt;/code&gt;!&#xA;Avrai qualcosa come &lt;code&gt;plain_root_url&lt;/code&gt; e &lt;code&gt;ssl_login_url&lt;/code&gt; — come se fossero&#xA;integrati nel framework.&lt;/p&gt;&#xA;&lt;p&gt;Poi, un plugin semplicissimo per &lt;a href=&#34;http://github.com/panmind/bigbro&#34; target=&#34;_blank&#34;&gt;Google&#xA;Analytics&lt;/a&gt;, con supporto &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;, un&#xA;paio di helper per i test e un&#xA;&lt;a href=&#34;http://github.com/Panmind/bigbro/blob/master/js/jquery.analytics.js&#34; target=&#34;_blank&#34;&gt;embrione&lt;/a&gt;&#xA;di framework JS per Analytics — si spera che evolva in un plugin jQuery&#xA;completo. Poi, un&amp;rsquo;interfaccia&#xA;&lt;a href=&#34;http://github.com/Panmind/recaptcha&#34; target=&#34;_blank&#34;&gt;ReCaptcha&lt;/a&gt;, con supporto alla validazione&#xA;AJAX, e infine un&amp;rsquo;interfaccia &lt;a href=&#34;http://github.com/Panmind/zendesk&#34; target=&#34;_blank&#34;&gt;Zendesk&lt;/a&gt;&#xA;per Rails.&lt;/p&gt;&#xA;&lt;p&gt;Abbiamo rilasciato anche altro codice sull&amp;rsquo;&lt;a href=&#34;http://github.com/Panmind&#34; target=&#34;_blank&#34;&gt;account GitHub di&#xA;Panmind&lt;/a&gt;, incluso il bel &lt;a href=&#34;http://github.com/Panmind/jquery-ajax-nav&#34; target=&#34;_blank&#34;&gt;AJAX Navigation&#xA;Framework&lt;/a&gt; che implementa tutto il&#xA;codice boilerplate per la navigazione AJAX ultra-veloce dei&#xA;&lt;a href=&#34;http://panmind.org/search&#34; target=&#34;_blank&#34;&gt;contenuti&lt;/a&gt; e dei&#xA;&lt;a href=&#34;http://panmind.org/tour/collaborate&#34; target=&#34;_blank&#34;&gt;progetti&lt;/a&gt; di Panmind.&lt;/p&gt;&#xA;&lt;p&gt;La presentazione segue: puoi scaricarla in PDF (nessun &lt;a href=&#34;https://sindro.me/posts/2010-08-04-on-the-iphone-pdf-and-kernel-exploit&#34;&gt;exploit, lo&#xA;giuro!&lt;/a&gt;) &lt;a href=&#34;https://sindro.me/posts/2010-08-05-panmind-at-ruby-social-club/Panmind_at_Ruby_Social_Club_Milano.pdf&#34;&gt;da questo&#xA;link&lt;/a&gt;&#xA;o visualizzarla/commentarla su Slideshare&#xA;&lt;a href=&#34;http://www.slideshare.net/panmind/panmind-open-source-releases-presented&#34; target=&#34;_blank&#34;&gt;qui&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rails3: Better, Faster, Stronger</title>
      <link>https://sindro.me/it/posts/2009-06-04-rails3-better-faster-stronger/</link>
      <pubDate>Thu, 04 Jun 2009 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-06-04-rails3-better-faster-stronger/</guid>
      <description>&lt;div style=&#34;float:left; margin:5px 10px 0 0;&#34;&gt;&lt;img style=&#34;display:inline-block&#34;&#xA;src=&#34;https://sindro.me/posts/2009-06-04-rails3-better-faster-stronger/rails3-harder-better-faster-stronger.png&#34;&#xA;/&gt;&lt;/div&gt;&#xA;&lt;p&gt;Per chi capisce l&#39;italiano (e se stai leggendo questa versione, direi di sì), ho appena &lt;a&#xA;href=&#34;http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&#34;&gt;pubblicato&#xA;un articolo&lt;/a&gt; su &lt;a href=&#34;http://therubymine.com/&#34;&gt;therubymine.com&lt;/a&gt; sulla&#xA;prossima release del framework &lt;a href=&#34;http://rubyonrails.com/&#34;&gt;Ruby on Rails&lt;/a&gt;,&#xA;la versione 3.0: la grande novità è la fusione con un altro web framework Ruby, &lt;a&#xA;href=&#34;http://merbivore.com/&#34;&gt;merb&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Buona lettura! :-)&lt;/p&gt;&#xA;&lt;p&gt;&lt;big&gt;&lt;a href=&#34;http://web.archive.org/web/20100125191434/http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&#34;&gt;http://therubymine.com/2009/06/04/rails3-better-faster-stronger/&lt;/a&gt;&lt;/big&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Un miglioramento a permalink_fu: permettere la modifica dei permalink e inviare redirect HTTP al volo</title>
      <link>https://sindro.me/it/posts/2009-01-29-a-permalink_fu-improvement-allow-modification-of-permalinks-and-create-redirects-on-the-fly/</link>
      <pubDate>Thu, 29 Jan 2009 19:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2009-01-29-a-permalink_fu-improvement-allow-modification-of-permalinks-and-create-redirects-on-the-fly/</guid>
      <description>&lt;p&gt;Un altro spin-off dal sito &lt;a href=&#34;http://www.visitacsa.it/&#34; target=&#34;_blank&#34;&gt;www.visitacsa.it&lt;/a&gt;: un&#xA;miglioramento a&#xA;&lt;a href=&#34;http://github.com/technoweenie/permalink_fu/tree/master&#34; target=&#34;_blank&#34;&gt;permalink_fu&lt;/a&gt; che&#xA;permette &lt;strong&gt;permalink dinamici&lt;/strong&gt;. Lo so che è un&#xA;&lt;a href=&#34;http://en.wikipedia.org/wiki/Oxymoron&#34; target=&#34;_blank&#34;&gt;ossimoro&lt;/a&gt;, perché i permalink dovrebbero&#xA;essere&amp;hellip; beh&amp;hellip; permanenti! E siccome i &lt;a href=&#34;http://www.searchlores.org/main.htm&#34; target=&#34;_blank&#34;&gt;motori di&#xA;ricerca&lt;/a&gt; li indicizzano, non dovrebbero&#xA;mai cambiare. Ma cosa succede quando pubblichi &lt;em&gt;qualcosa&lt;/em&gt;, il tuo permalink&#xA;viene generato con permalink_fu usando il &lt;em&gt;titolo&lt;/em&gt; del tuo post, e dopo un&#xA;paio di giorni vuoi cambiare il titolo, e anche il permalink sotto il quale il&#xA;post è accessibile?&lt;/p&gt;&#xA;&lt;p&gt;Seguendo la&#xA;&lt;a href=&#34;http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html&#34; target=&#34;_blank&#34;&gt;specifica&lt;/a&gt;, la tua&#xA;applicazione dovrebbe inviare uno status HTTP &lt;em&gt;301 moved permanently&lt;/em&gt; quando si&#xA;accede al vecchio permalink e fare redirect del client verso il nuovo Uniform&#xA;Resource Locator. Questo è più o meno quello che fa la mia modifica a&#xA;&lt;em&gt;permalink_fu&lt;/em&gt;: ogni volta che gli attributi del tuo post vengono modificati, il&#xA;permalink precedente e quello nuovo vengono salvati nel database, e puoi&#xA;abilitare il tuo controller a generare redirect &lt;em&gt;302 moved temporarily&lt;/em&gt; quando&#xA;necessario. In altre parole, controlla se l&amp;rsquo;URL richiesto è un vecchio&#xA;permalink e reindirizza automagicamente il client verso quello nuovo.&lt;/p&gt;&#xA;&lt;p&gt;Tutto avviene dietro le quinte, e il plugin ha anche dei comodi task rake per&#xA;impostare il model Redirect e le migration associate. E puoi anche cambiarne&#xA;il nome, ovviamente! :)&lt;/p&gt;&#xA;&lt;p&gt;Il codice &lt;em&gt;302&lt;/em&gt; è stato scelto perché lo status code &lt;em&gt;301 permanent&lt;/em&gt; &lt;a href=&#34;http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;amp;amp;answer=40132&#34; target=&#34;_blank&#34;&gt;ha&#xA;effetti piuttosto dirompenti sui motori di&#xA;ricerca&lt;/a&gt;,&#xA;ma ulteriori discussioni sono benvenute.&lt;/p&gt;&#xA;&lt;p&gt;Dai un&amp;rsquo;occhiata al &lt;a href=&#34;http://github.com/vjt/permalink_fu/tree/master&#34; target=&#34;_blank&#34;&gt;mio repository su&#xA;GitHub&lt;/a&gt;, leggi il&#xA;&lt;a href=&#34;http://github.com/vjt/permalink_fu/blob/b8d979f28c9795389cc65e9670a3529f805618dc/README&#34; target=&#34;_blank&#34;&gt;README&lt;/a&gt;&#xA;che contiene la documentazione delle funzionalità aggiunte, e guarda il codice!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rimuovere un link trigger di lightwindow dopo una chiamata AJAX</title>
      <link>https://sindro.me/it/posts/2008-05-21-remove-a-lightwindow-trigger-link-after-an-ajax-call/</link>
      <pubDate>Wed, 21 May 2008 17:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-05-21-remove-a-lightwindow-trigger-link-after-an-ajax-call/</guid>
      <description>&lt;p&gt;Ecco, questo è il risultato di 2 giorni di testate contro il muro con lightwindow:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Index: public/javascripts/lightwindow.js, line 444&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;_removeLink&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// remove it from the links array&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// remove it from the gallery links array&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_getGalleryInfo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;rel&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gallery&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;galleries&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;klass&lt;/span&gt;][&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;removed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chiama questa funzione dal tuo template .rjs, qualcosa tipo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;page &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;myLightWindow._removeLink($(&amp;#39;element&amp;#39;).down(&amp;#39;a.lightwindow&amp;#39;));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Più dettagli a seguire, quando questo lavoro sarà completo ;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Active Gibberish</title>
      <link>https://sindro.me/it/posts/2008-01-22-active-gibberish/</link>
      <pubDate>Tue, 22 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2008-01-22-active-gibberish/</guid>
      <description>&lt;p&gt;&lt;strong&gt;AGGIORNAMENTO: non ti serve questo codice, perché a partire dalla versione 2.2 di Rails il supporto alla localizzazione è integrato.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;localizzazione-dei-messaggi-di-errore-di-active-record&#34;&gt;Localizzazione dei messaggi di errore di Active Record&lt;/h2&gt;&#xA;&lt;p&gt;Oggi ho dovuto rispondere a una delle domande su cui ogni sviluppatore Rails&#xA;non anglofono prima o poi inciampa&amp;hellip; come localizzare i messaggi di errore di&#xA;AR per mostrarli in modo decente a un cliente che non parla inglese ;).&lt;/p&gt;&#xA;&lt;p&gt;Prima di tutto, grazie all&amp;rsquo;eccellente plugin gibberish di&#xA;&lt;a href=&#34;http://errtheblog.com&#34; target=&#34;_blank&#34;&gt;defunkt&lt;/a&gt; e al modo in cui gli errori di validazione di&#xA;AR sono esposti, il compito è stato portato a termine in modo semplice e&#xA;pulito, senza mettere troppo le mani negli internals di AR.&lt;/p&gt;&#xA;&lt;p&gt;Ho cominciato traducendo ogni messaggio di errore predefinito di AR, con questo&#xA;file di traduzione in &lt;code&gt;lang/it.yml&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Active Record errors&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_accepted&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deve essere accettato&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_not_a_number&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è un numero&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_blank&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_empty&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è un campo obbligatorio&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_inclusion&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è nella lista dei valori validi&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_too_long&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è troppo lungo (massimo %d caratteri)&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_exclusion&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è riservato&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_too_short&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è troppo corto (minimo %d caratteri)&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_invalid&lt;/span&gt;:      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non è valido&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_wrong_length&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;è errato, dovrebbe essere di %d caratteri&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_confirmation&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;non corrisponde&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_taken&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;esiste già&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# This one is not a default key, but I use it in my validations&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ar_greater_zero&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deve essere maggiore di zero&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e quattro righe in &lt;code&gt;config/environment.rb&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Gibberish&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;current_language &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:it&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Errors&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;default_error_messages &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Errors&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;default_error_messages&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;inject({}) {&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;h, (key, string)&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    h&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update(key &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; string&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ar_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;#{&lt;/span&gt;key&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;intern&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;# &amp;lt;em&amp;gt;Gibberish magic&amp;lt;/em&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La prima riga imposta semplicemente l&amp;rsquo;italiano (:it) come lingua predefinita,&#xA;l&amp;rsquo;inject costruisce un nuovo hash &lt;code&gt;error_messages&lt;/code&gt; usando Gibberish per&#xA;tradurre quelli predefiniti. Ho nominato ogni chiave di errore AR nel mio file&#xA;di traduzione con il prefisso &amp;ldquo;ar_&amp;rdquo;, per evitare possibili conflitti futuri di&#xA;chiavi. Infine, l&amp;rsquo;array di AR viene sovrascritto con quello appena costruito.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
