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

<channel>
	<title>Vinicius Ebersol</title>
	<atom:link href="http://vebersol.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://vebersol.net</link>
	<description>Blog on Rails</description>
	<lastBuildDate>Mon, 07 May 2012 03:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>jQuery Custom Form Plugin</title>
		<link>http://vebersol.net/2012/05/07/jquery-custom-form-plugin/</link>
		<comments>http://vebersol.net/2012/05/07/jquery-custom-form-plugin/#comments</comments>
		<pubDate>Mon, 07 May 2012 03:07:16 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Padrões Web]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=217</guid>
		<description><![CDATA[Um plugin que eu fiz essa semana pra facilitar a vida dos desenvolvedores. Esse plugin não é nenhuma revolução na história, porém tem uma coisa que eu não vi em nenhum outro, ele mantém os formulários acessíveis, sem perder a &#8230; <a href="http://vebersol.net/2012/05/07/jquery-custom-form-plugin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://vebersol.net/wp-content/uploads/2012/05/jquery-custom-form.png"><img class="size-full wp-image-218 aligncenter" title="jquery custom form" src="http://vebersol.net/wp-content/uploads/2012/05/jquery-custom-form.png" alt="jquery custom form example" width="621" height="279" /></a></p>
<p>Um plugin que eu fiz essa semana pra facilitar a vida dos desenvolvedores. Esse plugin não é nenhuma revolução na história, porém tem uma coisa que eu não vi em nenhum outro, ele mantém os formulários acessíveis, sem perder a beleza de um formulário customizado.</p>
<p>Veja a demo: <a href="http://vebersol.net/demos/jquery-custom-forms/">http://vebersol.net/demos/jquery-custom-forms/</a></p>
<p>Download do plugin no github: <a href="https://github.com/vebersol/jQuery-Custom-Forms">https://github.com/vebersol/jQuery-Custom-Forms</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2012/05/07/jquery-custom-form-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax crossdomain crossbrowser</title>
		<link>http://vebersol.net/2012/04/13/ajax-crossdomain-crossbrowser/</link>
		<comments>http://vebersol.net/2012/04/13/ajax-crossdomain-crossbrowser/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 14:06:20 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=208</guid>
		<description><![CDATA[O título do link pode parecer feio, mas é isso mesmo. É possível fazer esse tipo de requisição assíncrona usando a função $.ajax do jQuery e o dataType JSONP. Abaixo um exmplo do que eu fiz para testar. Ajax crossdomain &#8230; <a href="http://vebersol.net/2012/04/13/ajax-crossdomain-crossbrowser/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O título do link pode parecer feio, mas é isso mesmo. É possível fazer esse tipo de requisição assíncrona usando a função <a title="$.ajax" href="http://api.jquery.com/jQuery.ajax/">$.ajax</a> do <a title="jQuery home" href="http://jquery.com">jQuery</a> e o dataType <a href="http://en.wikipedia.org/wiki/JSONP">JSONP</a>.</p>
<p>Abaixo um exmplo do que eu fiz para testar. Ajax crossdomain testado inclusive no IE6.</p>
<p>Uma ressalva é importante: Eu usei o <a href="http://developer.yahoo.com/yql/">YQL</a> que é uma API do <a href="http://www.yahoo.com/">Yahoo</a> que retorna um jSON de uma URL qualquer.</p>
<pre>&lt;!doctype HTML&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Test&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"&gt;&lt;/script&gt;
        &lt;script type="text/javascript"&gt;
            // a variavel deve ser global para permitir a execução do callback em um javascript orientado a objetos.
            var externalAjax;

            var ExternalAjax = function() {
                this.url = 'http://vebersol.net';
                this.format = 'html'; //html, json
                this.jsonURL = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22'+encodeURIComponent(this.url)+'%22&amp;format='+this.format+'&amp;diagnostics=true&amp;callback=externalAjax.getJsonCallback';

                this.init();
            }

            ExternalAjax.prototype = {
                init: function() {
                    $.ajax({
                      url: this.jsonURL,
                      dataType: 'jsonp'
                    });
                },
                // o nome desta função é passada como parâmetro, chamado callback na variável jsonURL. Ela vai ser executada assim que a request for finalizada.    
                getJsonCallback: function(data) {
                    if (this.format == 'html') {
                        $('body').append(data.results[0]);
                    }
                    else if (this.format == 'json') {
                        // execute o seu código para usar o seu jSON como bem entender...
                        console.log(data);
                    }
                }
            }

            $(function() {
                externalAjax = new ExternalAjax();
            });
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2012/04/13/ajax-crossdomain-crossbrowser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQPlayer &#8211; HTML 5 Video Player Plugin para jQuery</title>
		<link>http://vebersol.net/2012/04/10/jqplayer-html-5-video-player-plugin-para-jquery/</link>
		<comments>http://vebersol.net/2012/04/10/jqplayer-html-5-video-player-plugin-para-jquery/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 03:59:23 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=203</guid>
		<description><![CDATA[Há um bom tempo tinha desenvolvido um plugin para jQuery. Consiste em um plugin que facilita a vida do desenvolvedor para criar um video player html 5 de forma fácil e customizável o bastante de modo que permite: alterar posição &#8230; <a href="http://vebersol.net/2012/04/10/jqplayer-html-5-video-player-plugin-para-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a title="jQPlayer" href="http://jqplayer.vebersol.net"><img class="size-full wp-image-204 aligncenter" title="jQPlayer" src="http://vebersol.net/wp-content/uploads/2012/04/logo.jpg" alt="jQplayer logo" width="414" height="187" /></a></p>
<p>Há um bom tempo tinha desenvolvido um plugin para jQuery. Consiste em um plugin que facilita a vida do desenvolvedor para criar um <a title="jQPlayer" href="http://jqplayer.vebersol.net">video player html 5</a> de forma fácil e customizável o bastante de modo que permite:</p>
<ul>
<li>alterar posição de controles;</li>
<li>selecionar os controles você quer ou não exibir;</li>
<li>suporte a legendas em formato srt;</li>
<li>suporte a fullscreen para os broswers que já têm a API fullscreen disponível (atualmente Chrome e Firefox);</li>
<li>customizar classes CSS dos controles gerados pelo plugin;</li>
<li>adicionar botões personalizados (ex.: links ou botões que executam métodos de sua escolha);</li>
<li>possibilidade de adicionar callbacks customizados para eventos padrões de um vídeo (ex.: play, pause, end);</li>
</ul>
<p>Portanto, para você que precisa de versões mais específicas, de acordo com o cliente, <a title="jQPlayer" href="http://jqplayer.vebersol.net">jQPlayer</a> é a melhor opção.</p>
<p>Veja a <a href="http://jqplayer.vebersol.net">demo do jQPlayer</a> ou acesse o repositório do jQPlayer no <a title="Repositório do jQPlayer no github" href="https://github.com/vebersol/jQPlayer">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2012/04/10/jqplayer-html-5-video-player-plugin-para-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vaga Desenvolvedor Ruby on Rails Senior</title>
		<link>http://vebersol.net/2011/12/28/vaga-desenvolvedor-ruby-on-rails-senior/</link>
		<comments>http://vebersol.net/2011/12/28/vaga-desenvolvedor-ruby-on-rails-senior/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 13:52:41 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=193</guid>
		<description><![CDATA[A Connectere AgroGestão está procurando um desenvolvedor Ruby on Rails Senior. Confira os dados da vaga abaixo: Requisitos: Ruby e RubyonRails (&#62;= 3.0) Experiência no desenvolvimento de sistemas empresariais (não somente sites institucionais e blogs) é desejado Curso superior e &#8230; <a href="http://vebersol.net/2011/12/28/vaga-desenvolvedor-ruby-on-rails-senior/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A <a title="Connectere Agro Gestão" href="http://www.connectere.agr.br/">Connectere AgroGestão</a> está procurando um desenvolvedor Ruby on Rails Senior. Confira os dados da vaga abaixo:</p>
<h2>Requisitos:</h2>
<ul>
<li>Ruby e RubyonRails (&gt;= 3.0)</li>
<li>Experiência no desenvolvimento de sistemas empresariais (não somente sites institucionais e blogs) é desejado</li>
<li>Curso superior e fluência na língua inglesa são diferenciais apreciados</li>
<li>Bons conhecimentos em git, SQL, html, haml, javascript (jQuery)</li>
</ul>
<div>
<h2>Função:</h2>
<ul>
<li>Desenvolvedor RoR Pleno/Sênior</li>
<li>Participação ativa na definição do sistema</li>
<li>Desenvolvimento das regras de negócio (métodos na camada model)</li>
<li>Desenvolvimento de testes unitários</li>
</ul>
<div></div>
<h2>Contratação:</h2>
<ul>
<li>Contratação como PJ</li>
<li>Remuneração estabelecida em comum acordo e de acordo com a experiência e conhecimentos demonstrados</li>
<li>Trabalho remoto c/ dedicação exclusiva</li>
</ul>
<p>Entrar em contato com Marcelo Lageman (<a title="rh@connectere.agr.br" href="mailto:rh@connectere.agr.br">rh@connectere.agr.br</a>)</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2011/12/28/vaga-desenvolvedor-ruby-on-rails-senior/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Callback para CSS3 transitions</title>
		<link>http://vebersol.net/2011/01/05/callback-para-css3-transitions/</link>
		<comments>http://vebersol.net/2011/01/05/callback-para-css3-transitions/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 12:22:42 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=188</guid>
		<description><![CDATA[Para pessoas que estão acostumadas com o método animate do jQuery, que tem um callback, trabalhar com CSS3 pode ser um pouco complicado. Aqui vai uma dica rápida pra adicionar callbacks às suas transições. Existe um método que tem nomes &#8230; <a href="http://vebersol.net/2011/01/05/callback-para-css3-transitions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para pessoas que estão acostumadas com o método <strong>animate</strong> do <strong>jQuery</strong>,  que tem um <strong>callback</strong>, trabalhar com <strong>CSS3</strong> pode ser um pouco complicado.  Aqui vai uma dica rápida pra adicionar callbacks às suas transições.</p>
<p>Existe um método que tem nomes diferentes para <strong>Mozilla</strong>, <strong>webkit</strong> e <strong>Opera</strong>, respectivamente:</p>
<ul>
<li>transitionend</li>
<li>webKitTransitionEnd</li>
<li>oTransitionEnd</li>
</ul>
<pre>element.addEventListener(
    'transitionend', //depende do browser (listado acima)
    function( event ) {
        alert( "Finished transition!" );
    },
    false
);</pre>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2011/01/05/callback-para-css3-transitions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bug com a tag video no iPad</title>
		<link>http://vebersol.net/2010/12/30/bug-com-a-tag-video-no-ipad/</link>
		<comments>http://vebersol.net/2010/12/30/bug-com-a-tag-video-no-ipad/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 13:46:28 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=173</guid>
		<description><![CDATA[Como muitos que trabalham com web, tenho trabalhado bastante em desenvolvimento para dispositivos móveis, a maioria dos projetos para iPad e iPhone. Nesse projeto em especial, estamos desenvolvendo uma versão HTML5 de um site de um cliente famoso. A geração &#8230; <a href="http://vebersol.net/2010/12/30/bug-com-a-tag-video-no-ipad/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Como muitos que trabalham com web, tenho trabalhado bastante em desenvolvimento para <strong>dispositivos móveis</strong>, a maioria dos projetos para <strong>iPad</strong> e <strong>iPhone</strong>. Nesse projeto em especial, estamos desenvolvendo uma versão <strong>HTML5</strong> de um site de um cliente famoso. A geração do conteúdo é toda feita através de uma biblioteca estruturada em componentes e um desses componentes é um player de video em HTML cujo controle do video é todo feito através de outra biblioteca <strong>javascript</strong> que eu desenvolvi.</p>
<p>Durante o desenvolvimento, encontrei um <strong>bug</strong> muito estranho que ocorria somente no iPad. A princípio pensei que era um problema na geração dos HTML&#8217;s da biblioteca e fiquei alguns dias procurando o tal do problema, e nada&#8230;</p>
<p>A solução veio de um lampejo ao ver o <strong>XML</strong> que utilizamos para carregar o conteúdo. O XML tem todos os dados do vídeo, inclusive as duas versões de vídeo nos formatos suportados (ogg e mp4) pelos diferentes browsers que suportam a <strong>tag &lt;video&gt;</strong>. Ele montava o vídeo da seguinte forma:</p>
<p><code>&lt;video width="650" height="250" data-quality="normal" poster="../_img/poster.jpg" preload="nopreload"&gt;<br />
    &lt;source src="../_media/demo.ogg"&gt;&lt;/source&gt;<br />
    &lt;source src="../_media/demo.mp4"&gt;&lt;/source&gt;<br />
    Your browser doesn't support this video.<br />
&lt;/video&gt;<br />
</code></p>
<p>No entanto, todos os dispositivos da <strong>Apple</strong>, vêm com um <strong>codec de vídeo</strong> diferente dos demais browsers, <strong>MPEG 4</strong>. Na tabela abaixo é mais fácil de entender a compatibilidade:</p>
<p><img class="aligncenter size-full wp-image-174" title="video_formats" src="http://vebersol.net/wp-content/uploads/2010/12/video_formats.png" alt="" width="636" height="72" /></p>
<p><small>Fonte: <a href="http://vebersol.net/wp-content/uploads/2010/12/video_formats.png">http://www.w3schools.com/html5/html5_video.asp</a></small></p>
<p>No hora que eu vi o XML me dei conta que o video no formato ogg estava antes do video mp4 no código, simplesmente troquei de posição e funcionou, como você pode ver abaixo:</p>
<p><code>&lt;video width="650" height="250" data-quality="normal" poster="../_img/poster.jpg" preload="nopreload"&gt;<br />
    <span style="color: #ff0000;">&lt;source src="../_media/demo.mp4"&gt;&lt;/source&gt;</span><br />
    &lt;source src="../_media/demo.ogg"&gt;&lt;/source&gt;<br />
    Your browser doesn't support this video.<br />
&lt;/video&gt;<br />
</code></p>
<p>E essa foi a solução pra todos os meus problemas&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2010/12/30/bug-com-a-tag-video-no-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vaga para programador de interface</title>
		<link>http://vebersol.net/2010/10/27/vaga-para-programador-de-interface/</link>
		<comments>http://vebersol.net/2010/10/27/vaga-para-programador-de-interface/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 16:20:28 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Off-topic]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=167</guid>
		<description><![CDATA[A CONRAD CAINE, agência digital com escritórios em Munich, Pelotas e Buenos Aires procura dois programadores de interface para integrar a equipe de Pelotas. Responsabilidades Codificar páginas que funcionem perfeitamente em diversos browsers, de uma maneira fiel ao projeto original &#8230; <a href="http://vebersol.net/2010/10/27/vaga-para-programador-de-interface/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://conrad-caine.com" target="_blank"><strong>CONRAD CAINE</strong></a>, agência digital com escritórios em Munich, Pelotas e Buenos Aires procura dois programadores de interface para integrar a equipe de Pelotas.</p>
<h2>Responsabilidades</h2>
<ul>
<li>Codificar páginas que funcionem perfeitamente em diversos browsers, de uma maneira fiel ao projeto original (funcionalmente e visualmente);</li>
<li>Codificar interfaces interativas utilizando JavaScript/Ajax;</li>
<li>Pesquisar novas técnicas de desenvolvimento;</li>
<li>Aplicar com sucesso técnicas de SEO;</li>
<li>Escrever código limpo e bem organizado;</li>
</ul>
<h2>Qualificações</h2>
<ul>
<li>Experiência na utilização das bibliotecas JavaScript mais conhecidas no mercado;</li>
<li>Conhecimento acerca das técnicas de SEO;</li>
<li>Habilidade para desenvolver websites com um alto padrão de usabilidade / acessibilidade;</li>
<li>Fluência nos padrões W3C (HTML/XHTML/CSS);</li>
<li>Pró-ativo e autodidata;</li>
<li>Rápido na solução de bugs;</li>
<li>Habilidade para entregar estimativas corretas;</li>
<li>Inglês intermediário/avançado;</li>
<li>Experiência com Photoshop/Fireworks;</li>
</ul>
<p>Currículos devem ser enviados para <a href="mailto:jobs.pelotas@conrad-caine.com">jobs.pelotas@conrad-caine.com</a>, com o título &#8220;Programador de Interface&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2010/10/27/vaga-para-programador-de-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Substituir tag por dados do banco utilizando Ruby on Rails</title>
		<link>http://vebersol.net/2010/05/19/substituir-tag-por-dados-do-banco-utilizando-ruby-on-rails/</link>
		<comments>http://vebersol.net/2010/05/19/substituir-tag-por-dados-do-banco-utilizando-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 19 May 2010 22:46:50 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=144</guid>
		<description><![CDATA[Muitas vezes procuramos dar mais independência ao cliente, possibilitando o mínimo de intervenção possível em uma aplicação, por menor que seja. Hoje pela manhã, enquanto pesquisava algum CMS simples em Rails, encontrei uma funcionalidade muito interessante no Radiant, que permite &#8230; <a href="http://vebersol.net/2010/05/19/substituir-tag-por-dados-do-banco-utilizando-ruby-on-rails/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes procuramos dar mais independência ao cliente, possibilitando o mínimo de intervenção  possível em uma aplicação, por menor que seja. Hoje pela manhã, enquanto pesquisava algum CMS simples em Rails, encontrei uma funcionalidade muito interessante no <a href="http://radiantcms.org/">Radiant</a>, que permite ao usuário adicionar tags. Ele mostra uma popup com tags disponíveis que são métodos como: escape_html, author, date. Estes métodos são próprios do CMS e não era exatamente o que eu estava procurando no momento.</p>
<p>O que eu pensei era permitir que um usuário comum pudesse facilmente exibir um dado contido dentro do modelo Post. Por exemplo, você deseja pôr a data da última atualização dos dados. Seu objeto Post tem um campo chamado updated_at. Para pôr isso no texto a idéia é que você utilize uma tag especial que será substituída pelo dado capturado do banco. Foi pensando nisso e baseado nas tags do Radiant que eu fiz o código abaixo:</p>
<pre><span class="keyword">class</span> <span class="type">Post</span> &lt; <span class="type">ActiveRecord</span>::<span class="type">Base</span>
  belongs_to <span class="constant">:category</span>
  validates_presence_of <span class="constant">:name</span>, <span class="constant">:title</span>, <span class="constant">:body</span>, <span class="constant">:permalink</span>, <span class="constant">:user_id</span>, <span class="constant">:category_id</span>

<span class="comment-delimiter">  # </span><span class="comment">Method to replace your special tag.
</span>  <span class="keyword">def</span> <span class="function-name">self.replace_special_tags</span>(object, field)
    text = eval(<span class="string">'object.'</span>+field)
    <span class="keyword">if</span> !text.blank?
      tags = <span class="variable-name">self</span>.get_tags(text)
      <span class="keyword">if</span> !tags.blank?
        tags.each <span class="keyword">do</span> |tag|
          text = text.gsub(tag.to_s, <span class="variable-name">self</span>.get_param(tag, object))
        <span class="keyword">end</span>
      <span class="keyword">end</span>
    <span class="keyword">end</span>
    <span class="keyword">return</span> text
  <span class="keyword">end</span>

  <span class="comment-delimiter"># </span><span class="comment">After catch your tags, pass the tag and object that you need to use.
</span>  <span class="keyword">def</span> <span class="function-name">self.get_param</span>(tag, object)
    pattern = <span class="string">/[^&lt;r:].*[^ \/&gt;]/</span>
    param = tag.to_s[pattern]
    replace = object.respond_to?(param.split(<span class="string">'.'</span>).first) ? eval(<span class="string">'object.'</span>+param) : <span class="variable-name">nil</span>
    <span class="keyword">if</span> !replace.blank?
      <span class="keyword">return</span> replace.to_s
    <span class="keyword">else</span>
      <span class="keyword">return</span> <span class="string">'&lt;!-- wrong field --&gt;'</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>

  <span class="comment-delimiter"># </span><span class="comment">Get all special tags on text
</span>  <span class="keyword">def</span> <span class="function-name">self.get_tags</span>(text)
    pattern = <span class="string">/(&lt;r:[a-z\.]+ \/&gt;)/</span>
    <span class="keyword">if</span> !text.scan(pattern).blank?
      text.scan(pattern)
    <span class="keyword">end</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>
</pre>
<p>O modelo acima permite exibir dados direto do banco  ao passar um objeto e o respectivo campo de texto que contém as tags especiais. Vejamos como funciona na prática:</p>
<pre><span class="type">Post</span>.replace_special_tags(<span class="variable-name">@post</span>, <span class="string">'body'</span>)</pre>
<p>Assim, todas as tags especiais que eu adicionar ao campo <em>body</em> serão substituídas pelo campo correspondente no objeto @post. Vejamos um exemplo do nosso objeto:</p>
<p><code><br />
&gt;&gt; @post<br />
=&gt; #&lt;Post id: 1, name: "Minha página de teste", title: "Titulo da minha página de teste", body: "&lt;p&gt;Ah!!&lt;/p&gt;\r\n\r\n&lt;ul&gt;\r\n  &lt;li&gt;&lt;strong&gt;Nome da categori...", permalink: "minha-pagina-de-teste", active: false, public: nil, user_id: 1, category_id: 26, created_at: "2010-05-19 21:39:52", updated_at: "2010-05-19 21:39:52"&gt;</code></p>
<p>Nesse caso, o post pertence a uma categoria:</p>
<p><code><br />
&gt;&gt; @post.category<br />
=&gt; #&lt;Category id: 26, name: "Minha categoria de teste", permalink: "minha-categoria-de-teste", parent_id: nil, created_at: "2010-05-19 22:09:16", updated_at: "2010-05-19 22:09:16"&gt;<br />
</code></p>
<p>Portanto, você pode utilizar, por exemplo:</p>
<ul>
<li>&lt;r:title /&gt;</li>
<li>&lt;r:user_id /&gt; * em breve, um relacionamento poderá permitir acesso aos dados do usuário. Mas cuidado com as permissões aqui. É muito importante limitar o uso deste recurso.</li>
<li>&lt;r:category.name /&gt;</li>
<li>&lt;r:category.permalink /&gt;</li>
</ul>
<p>Na prática, seu campo body ser assim:</p>
<pre>&lt;p&gt;My replace tags test&lt;/p&gt;
&lt;dl&gt;
  &lt;dt&gt;My category name:&lt;/dt&gt;
  &lt;dd&gt;&lt;r:category.name /&gt;&lt;/dd&gt;
  &lt;dt&gt;My category permalink:&lt;/dt&gt;
  &lt;dd&gt;&lt;r:category.permalink /&gt;&lt;/dd&gt;
  &lt;dt&gt;My post permalink:&lt;/dt&gt;
  &lt;dd&gt;&lt;r:permalink /&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="breadcrumb"&gt;
  &lt;a href="/categories/&lt;r:category.permalink&gt;"&gt;&lt;span&gt;&lt;r:category.name&gt;&lt;/span&gt;&lt;/a&gt; |
  &lt;a  href="/categories/&lt;r:category.permalink&gt;/post/&lt;r:permalink&gt;"&gt;&lt;span&gt;&lt;r:name&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Acima estão somente alguns exemplos de dados que você pode utilizar. Como o método que eu criei não limita a utilização de campos, tudo que você chamar do objeto @post será exibido, se existir. O interessante a partir daqui é pensar em criar uma lista dos dados &#8220;acessíveis&#8221; para permitir chamar somente estes, tornando a utilização deste método muito mais segura.</p>
<p>Ps.: Desculpem pelo título, porém não encontrei nada que pudesse descrever isso em poucas palavras e da forma correta. Recebo sugestões.</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2010/05/19/substituir-tag-por-dados-do-banco-utilizando-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery TOOLS</title>
		<link>http://vebersol.net/2010/01/21/jquery-tools/</link>
		<comments>http://vebersol.net/2010/01/21/jquery-tools/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 15:42:26 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=132</guid>
		<description><![CDATA[jQuery TOOLS é uma biblioteca super completa que facilita muito a criação de tarefas hoje comuns, veja as demos dos recursos dessa biblioteca: Tabs; Tooltips; Overlay &#8211; Screenlocker para popups; Expose &#8211; Serve para destacar elementos da página; Scrollable &#8211; &#8230; <a href="http://vebersol.net/2010/01/21/jquery-tools/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img title="jquery-tools" src="http://vebersol.net/wp-content/uploads/2010/01/jquery-tools.jpg" alt="" width="400" height="192" /></p>
<p><strong><a href="http://flowplayer.org/tools/index.html">jQuery TOOLS</a></strong> é uma biblioteca super completa que facilita muito a criação de tarefas hoje comuns, veja as demos dos recursos dessa biblioteca:</p>
<ul>
<li><a href="http://flowplayer.org/tools/demos/tabs/index.html">Tabs</a>;</li>
<li><a href="http://flowplayer.org/tools/demos/tooltip/index.html">Tooltips</a>;</li>
<li><a href="http://flowplayer.org/tools/demos/overlay/index.html">Overlay</a> &#8211; Screenlocker para popups;</li>
<li><a href="http://flowplayer.org/tools/demos/expose/index.html">Expose</a> &#8211; Serve para destacar elementos da página;</li>
<li><a href="http://flowplayer.org/tools/demos/scrollable/index.html">Scrollable</a> &#8211; entre outras coisas serve para fazer galerias de imagens bem legais;</li>
<li><a href="http://flowplayer.org/tools/demos/flashembed/index.html">Flash embed</a> &#8211; uma espécide de SWF Object que já vem inclusa e funciona muito bem com o player de vídeo dos mesmos autores dessa biblioteca;</li>
</ul>
<p>É possível combinar esses recursos como você pode ver <a href="http://flowplayer.org/tools/demos/combine/scrollable-gallery-with-tooltips.html">aqui</a>. Ou ainda existe uma demonstração de <a href="http://flowplayer.org/demos/tools/overlay.html"><strong>como integrar o player de vídeo em flash deles com o jQuery TOOLS</strong></a>.</p>
<h3>Flowplayer</h3>
<p>O <strong><a href="http://flowplayer.org/index.html">Flowplayer</a></strong> é um player de vídeo em flash desenvolvido pelos mesmos autores do jQuery TOOLS. Veja <a href="http://flowplayer.org/demos/index.html">aqui</a> algumas demos do player em ação.</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2010/01/21/jquery-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>drails &#8211; Dojo + Rails</title>
		<link>http://vebersol.net/2009/09/15/drails-dojo-rails/</link>
		<comments>http://vebersol.net/2009/09/15/drails-dojo-rails/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 13:04:54 +0000</pubDate>
		<dc:creator>Vinicius Ebersol</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://vebersol.net/?p=125</guid>
		<description><![CDATA[Dica rápida para quem se interessou no post anterior sobre Dojo. Eu pesquisei e encontrei um plugin que substitui os helpers do Rails para utilizar Dojo ao invés de Prototype. É o drails. A instalação é simples: # drails relies &#8230; <a href="http://vebersol.net/2009/09/15/drails-dojo-rails/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-129 aligncenter" title="drails" src="http://vebersol.net/wp-content/uploads/2009/09/drails.png" alt="drails" width="273" height="123" /></p>
<p>Dica rápida para quem se interessou no post anterior sobre <a href="http://dojotoolkit.org/">Dojo</a>. Eu pesquisei e encontrei um plugin que substitui os helpers do <a href="http://rubyonrails.com">Rails</a> para utilizar Dojo ao invés de <a href="http://prototypejs.org/">Prototype</a>. É o <a href="http://d-rails.org/">drails</a>.</p>
<h3>A instalação é simples:</h3>
<pre># drails relies on the dojo-pkg gem.  Installing this gem can sometimes take a while
gem install dojo-pkg

cd my_rails_app
script/plugin install git://github.com/foobarfighter/drails.git</pre>
<p>Para maiores informações acesse o <a href="http://github.com/foobarfighter/drails/tree/v1.0.0">README</a> do plugin no github.</p>
]]></content:encoded>
			<wfw:commentRss>http://vebersol.net/2009/09/15/drails-dojo-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.806 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-19 12:25:40 -->

