<?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"
	>

<channel>
	<title>MouseOver Studio &#187; plugin</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/plugin/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Adicionando um &#8216;Carregando&#8230;&#8217; em todas as requisições Ajax com uma linha de código</title>
		<link>http://www.mouseoverstudio.com/blog/2010/05/14/adicionando-um-carregando-em-todas-as-requisicoes-ajax-com-uma-linha-de-codigo/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/05/14/adicionando-um-carregando-em-todas-as-requisicoes-ajax-com-uma-linha-de-codigo/#comments</comments>
		<pubDate>Sat, 15 May 2010 01:14:53 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[jQuery]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[loading]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=196</guid>
		<description><![CDATA[Caso estejam trabalhando com jQuery e precisem de uma imagem/mensagem estilo &#8220;Carregando&#8230;&#8221; em todas suas requisições Ajax, o plugin jquery.loading fornece essa funcionalidade com somente um linha de código. No meu caso ficou assim:
$.loading({
  onAjax: true,
  text: 'Carregando...',
  mask: true
});
A opção mask serve para adicionar uma div transparente que impossibilite novas ações [...]]]></description>
			<content:encoded><![CDATA[<p>Caso estejam trabalhando com <a href="http://jquery.com/">jQuery</a> e precisem de uma imagem/mensagem estilo &#8220;Carregando&#8230;&#8221; em todas suas requisições <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">Ajax</a>, o plugin <a href="http://plugins.jquery.com/project/loading">jquery.loading</a> fornece essa funcionalidade com somente um linha de código. No meu caso ficou assim:</p>
<pre class="prettyprint"><code>$.loading({
  onAjax: true,
  text: 'Carregando...',
  mask: true
});</code></pre>
<p>A opção <em>mask</em> serve para adicionar uma <em>div</em> transparente que impossibilite novas ações ate a requisição acabar.</p>
<p>Esse funcionalidade é possível devido que as requisições Ajax do jQuery disparam certos <a href="http://docs.jquery.com/Ajax_Events">eventos</a> ao longo do processo, o que nos permite fazer coisas muito legais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/05/14/adicionando-um-carregando-em-todas-as-requisicoes-ajax-com-uma-linha-de-codigo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Indexação de documentos em JRuby com ActiveLucene</title>
		<link>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:20:05 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Api]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[gem]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[jvm]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[active_lucene]]></category>

		<category><![CDATA[active_record]]></category>

		<category><![CDATA[engine]]></category>

		<category><![CDATA[full]]></category>

		<category><![CDATA[lucene]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[search]]></category>

		<category><![CDATA[Solr]]></category>

		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=192</guid>
		<description><![CDATA[ActiveLucene é uma interface para o Lucene similar com a interface do ActiveRecord e/ou ActiveModel.
Isso quer dizer que você pode gerar um scaffold numa aplicação Rails, ir no modelo, trocar ActiveRecord::Base por ActiveLucene::Document e tudo deveria continuar funcionando, com a diferença do modelo estar sendo salvo num índice do Lucene e não num banco de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/dcrec1/active_lucene">ActiveLucene</a> é uma interface para o <a href="http://lucene.apache.org/java/docs/index.html">Lucene</a> similar com a interface do <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord</a> e/ou <a href="http://github.com/rails/rails/tree/master/activemodel">ActiveModel</a>.</p>
<p>Isso quer dizer que você pode gerar um <a href="http://en.wikipedia.org/wiki/Scaffold_(programming)">scaffold</a> numa aplicação <a href="http://rubyonrails.org/">Rails</a>, ir no modelo, trocar ActiveRecord::Base por ActiveLucene::Document e tudo deveria continuar funcionando, com a diferença do modelo estar sendo salvo num índice do Lucene e não num banco de dados relacional.</p>
<p>Dado que os documentos são salvos num índice do Lucene, podemos procurar eles utilizando a <a href="http://lucene.apache.org/java/3_0_0/queryparsersyntax.html">sintaxe de query</a> do Lucene, sem esquecer que por ter uma interface similar à do ActiveRecord, podemos também procurar eles por um id.</p>
<p>A classe base do ActiveLucene se chama Document porque ao igual que os documentos de outros sistemas, não tem uma estrutura definida e todos os atributos são dinâmicos, pelo que você não tem que se preocupar com eles.</p>
<p>o ActiveLucene foi extraído do <a href="http://github.com/dcrec1/lunr">Lunr</a>, um servidor do qual vou falar num futuro post, mas hoje também pode ser utilizado em aplicações nas quais ter um banco de dados relacionais no faz muito sentido e especialmente nas quais se deseja procurar documentos por texto. </p>
<p>A restrição do ActiveLucene é que somente funciona com <a href="http://jruby.org/">JRuby</a>, dado que o Lucene é uma biblioteca em <a href="http://java.sun.com/">Java</a> que roda sobre a JVM. Mesmo assim, caso isso não for um problema, utilizar o ActiveLucene deve ser bem mais simples e leve que utilizar uma solução como o Sphinx ou o Solr, onde dependendo do caso pode resultar numa grande vantagem.</p>
<p>O Lucene tem um monte de funcionalidades e o ActiveLucene não suporta todas elas, mas dependendo das necessidades das pessoas elas serão indo adicionadas ao projeto. Hoje existe um suporte a highlighting e um pouco a paginação, como pode ser visto no seguinte video, junto com uma demonstração básica de como funciona a ferramenta:</p>
<p><object width="501" height="313"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9010209&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9010209&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="501" height="313"></embed></object>
<p><a href="http://vimeo.com/9010209">Full text search in JRuby with ActiveLucene</a> from <a href="http://vimeo.com/user1245982">Diego Carrion</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><em>Se você gostou do ActiveLucene, considera me <a href="http://www.workingwithrails.com/recommendation/new/person/13580-diego-carrion">recomendar</a> no <a href="http://workingwithrails.com/">Working With Rails</a>. Para ficar mais perto das novidades, não deixa de me <a href="http://twitter.com/dcrec1">seguir</a> no Twitter.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Deploys mais poderosos, simples e rápidos na Locaweb com Inploy</title>
		<link>http://www.mouseoverstudio.com/blog/2009/10/17/deploys-mais-poderosos-simples-e-rapidos-na-locaweb-com-imploy/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/10/17/deploys-mais-poderosos-simples-e-rapidos-na-locaweb-com-imploy/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 21:27:40 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Inploy]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[deploy]]></category>

		<category><![CDATA[locaweb]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=186</guid>
		<description><![CDATA[Tenho um servidor compartilhado na Locaweb onde de vez em quando subo aplicações para serem visualizadas por clientes. Ate o dia de ontem a melhor opção para realizar deploys nos servidores da Locaweb era utilizar a gem Locarails, do Akita, mas a partir de hoje o Inploy conta com um template chamado Locaweb, pelo que [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho um servidor compartilhado na <a href="http://www.locaweb.com">Locaweb</a> onde de vez em quando subo aplicações para serem visualizadas por clientes. Ate o dia de ontem a melhor opção para realizar deploys nos servidores da Locaweb era utilizar a gem <a href="http://github.com/akitaonrails/locarails/">Locarails</a>, do <a href="http://www.twitter.com/akitaonrails">Akita</a>, mas a partir de hoje o <a href="git://github.com/dcrec1/inploy.git">Inploy</a> conta com um template chamado Locaweb, pelo que dependendo do caso, pode ser uma melhor opção que a anterior.</p>
<p>Umas das coisas que de cara ja não gosto no Locarails é que utiliza o <a href="http://www.capify.org/index.php/Capistrano">Capistrano</a> por debaixo dos panos. Eu ja expliquei por que não gosto muito do Capistrano mas em poucas palavras nesse caso isso se resume a ter um monte de pastas releases que não me servem para nada, ter tarefas como <em>cap deploy</em> e <em>cap deploy:migration</em> que não fazem muito sentido e para finalizar, ter um monstro chamado de receita.</p>
<p>Para entender melhor meu ultimo argumento podem visualizar esse <a href="http://gist.github.com/212443">gist</a>, onde se encontra o arquivo deploy.rb configurado para trabalhar com Inploy e configurado para trabalhar com Locarails. Como podem ver, com o Inploy o arquivo de configuração fica bem mais simples e ainda faz mas coisas, aquelas que o Inploy faz por padrão, como por exemplo fazer um parse dos arquivos .less caso o plugin <a href="http://github.com/cloudhead/more">more</a> exista. Essa funcionalidade foi adicionada também hoje.</p>
<p>Outra coisa que não gosto do Locarails é que por padrão ele funciona como modo &#8220;copy&#8221;, então fica copiando tudo o repositorio em cada deploy e ainda copia coisas que não deveria, como por exemplo arquivos de upload ou outros que se encontram no .gitconfig e não estão na lista de exclusão. Essa lista de exclusão pode ser configurada mas configurar é muito chato. Como resultado disso os deploy são mais demorados.</p>
<p>Como solução a isso, os colaboradores do Locarails parece que recentemente contornaram esse problema adicionando um modo &#8220;git&#8221;. Na minha máquina no chegou a funcionar mas foi excelente porque vendo o código percebi que tem um jeito muito possivelmente melhor de levar o repositorio para o servidor que o jeito atual utilizado pelo Inploy. A grão vantagem de utilizar Git no deploy é que em cada um somente vão as mudanzas, pelo que os deploys resultam ser bem mais rápidos.</p>
<p>Como puderam ver no arquivo de configuração, para utilizar Inploy na Locaweb basta declarar no arquivo de configuração (config/deploy.rb) que queremos utilizar o template :locaweb, o usuario e o host:</p>
<pre class="prettyprint">deploy.template = :locaweb
deploy.application = "hebraika"
deploy.user = 'dcrec1'
deploy.hosts = ['host.us']</pre>
<p>Caso queiramos mandar a aplicação para uma pasta diferente de /home/:user/rails_app/:application, podemos configurar ela com <em>deploy.path</em>.</p>
<p>Gravei um pequeno video onde mostro muito rapidamente como utilizar o Inploy para realizar um deploy na Locaweb. Acho que o video esta bem claro mas se existir alguma duvida, não duvidar em questionar:</p>
<p><object width="501" height="313"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7116773&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=7116773&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="501" height="313"></embed></object>
<p><a href="http://vimeo.com/7116773">Deploy easily to Locaweb with Inploy</a> from <a href="http://vimeo.com/user1245982">Diego Carrion</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Finalmente, queria deixar claro que eu acho o Locarails uma excelente solução para quem quer trabalhar com Capistrano, devido a que tira a responsabilidade de ter que configurar muita coisa. As coisas pelas quais eu não gosto do Locarais não são culpa dos colaboradores é sim do Capistrano, que era sem duvida a melhor opção na epoca em qual foi criado o plugin.</p>
<p><em>Se você gostou do plugin ou ele foi de alguma utilidade para você, considera me <a href="http://www.workingwithrails.com/recommendation/new/person/13580-diego-carrion">recomendar</a> no <a href="http://workingwithrails.com/">Working With Rails</a>. Para ficar mais perto das novidades, não deixa de me <a href="http://twitter.com/dcrec1">seguir</a> no Twitter.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/10/17/deploys-mais-poderosos-simples-e-rapidos-na-locaweb-com-imploy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Importa contatos do Google, Yahoo, Live e CSV na tua aplicação Rails com uma linha</title>
		<link>http://www.mouseoverstudio.com/blog/2009/10/06/importa-contatos-do-google-yahoo-live-e-cvs-na-tua-aplicacao-rails-com-uma-linha/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/10/06/importa-contatos-do-google-yahoo-live-e-cvs-na-tua-aplicacao-rails-com-uma-linha/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 23:18:04 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[contacts]]></category>

		<category><![CDATA[contacts_rails]]></category>

		<category><![CDATA[cvs]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[live]]></category>

		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=182</guid>
		<description><![CDATA[Trabalhando em diversas aplicações me vi na necessidade de integra-las com diretórios de serviços como Google, Yahoo ou Live, de modo que os usuários podam importar seus contatos e realizar com eles diferentes ações.
Existe uma gem chamada contacts que encapsula a comunicação com esses serviços, porém mesmo utilizando ela, muito código ficou repetido entre minhas [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhando em diversas aplicações me vi na necessidade de integra-las com diretórios de serviços como Google, Yahoo ou Live, de modo que os usuários podam importar seus contatos e realizar com eles diferentes ações.</p>
<p>Existe uma gem chamada <a href="http://github.com/mislav/contacts/">contacts</a> que encapsula a comunicação com esses serviços, porém mesmo utilizando ela, muito código ficou repetido entre minhas aplicações, pelo que decidi encapsular mais um pouco e criar o <a href="http://github.com/dcrec1/contacts_rails">contacts_rails</a>.</p>
<p>Com o Contacts::Rails o único que devemos fazer é criar as rotas para algum controller:</p>
<pre class="prettyprint">map.import_google '/home/import/google',   :controller => "home", :action => 'import_google_contacts'
map.import_live   '/home/import/live',     :controller => "home", :action => 'import_live_contacts'
map.import_yahoo  '/home/import/yahoo',    :controller => "home", :action => 'import_yahoo_contacts'
map.import_csv    '/home/import/csv',      :controller => "home", :action => 'import_csv_contacts'</pre>
<p>e depois incluir <em>Contacts::Imports</em> no mesmo:</p>
<pre class="prettyprint">class HomeController < ApplicationController do
  include Contacts::Imports
end</pre>
<p>Quando um usuário acessar as diferentes rotas, ele sera redirecionado para o serviço correspondente, onde terá que se logar. Finalmente ele sera enviado para a view <em>import</em> com a variável @contacts contendo uma lista de contatos, onde cada contato é um array de dois items: nome e email.</p>
<p>Como podem ver nas rotas, também podemos importar contatos a partir de um arquivo CSV. Para isso devemos enviar no parâmetro <em>csv_file</em> um arquivo com a seguinte estrutura:</p>
</pre>
<pre class="prettyprint">email, name
bob@marley.com , Bob Marley
che@guevara.com, Che Guevara
john@lennon.com ,John Lennon</pre>
<p>A primeira linha existe porque podemos inverter a ordem das colunas, pelo que ela ajuda a identificar à que corresponde cada uma.</p>
<p><strong>Atenção</strong></p>
<p>Os serviços do Yahoo e do Live são bem mais burocráticos que o do Google, pelo que para utilizar eles precisaram configurar o arquivo config/contacts.yml após ter cadastrado suas aplicações:</p>
<p>http://developer.yahoo.com/addressbook/<br />
http://msdn.microsoft.com/en-us/library/cc287659.aspx</p>
<p>Queria agradecer ao <a href="http://twitter.com/hugobarauna">Hugo Baraúna</a> da <a href="http://www.plataformatec.com.br/">Plataforma</a>, que me ajudou com a gem explicando a implementação que ele fez no seu fork do projeto contacts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/10/06/importa-contatos-do-google-yahoo-live-e-cvs-na-tua-aplicacao-rails-com-uma-linha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Plugins de Remarkable para ActsAsTaggableOn, Paperclip e ThinkingSphinx</title>
		<link>http://www.mouseoverstudio.com/blog/2009/05/09/plugins-de-remarkable-para-actsastaggableon-paperclip-e-thinkingsphinx/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/05/09/plugins-de-remarkable-para-actsastaggableon-paperclip-e-thinkingsphinx/#comments</comments>
		<pubDate>Sat, 09 May 2009 20:51:05 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[ActsAsTaggableOn]]></category>

		<category><![CDATA[Paperclip]]></category>

		<category><![CDATA[RSpec::Rails]]></category>

		<category><![CDATA[Remarkable]]></category>

		<category><![CDATA[ThinkingSphinx]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[acts_as_taggable_on]]></category>

		<category><![CDATA[rspec-rails]]></category>

		<category><![CDATA[thinking_sphinx]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=166</guid>
		<description><![CDATA[Trabalhado num projeto me vi na necessidade de criar três plugins para o Remarkable: Remarkable::ActsAsTaggableOn, Remarkable::Paperclip e Remarkable::ThinkingSpinx.
Basicamente permitem escrever código como o seguinte:
describe User do
  should_act_as_taggable_on :categories

  should_have_attached_file :logo

  should_index 'addresses.city', :as => :address
  should_have_index_attribute :priority
end
Se esses plugins ajudaram você, considera por favor também me ajudar me recomendando no Working [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhado num projeto me vi na necessidade de criar três plugins para o <a href="http://github.com/carlosbrando/remarkable/tree/master">Remarkable</a>: <a href="http://github.com/dcrec1/remarkable_acts_as_taggable_on/tree/master">Remarkable::ActsAsTaggableOn</a>, <a href="http://github.com/dcrec1/remarkable_paperclip/tree/master">Remarkable::Paperclip</a> e <a href="http://github.com/dcrec1/remarkable_thinking_sphinx/tree/master">Remarkable::ThinkingSpinx</a>.</p>
<p>Basicamente permitem escrever código como o seguinte:</p>
<pre class="prettyprint">describe User do
  should_act_as_taggable_on :categories

  should_have_attached_file :logo

  should_index 'addresses.city', :as => :address
  should_have_index_attribute :priority
end</pre>
<p><em>Se esses plugins ajudaram você, considera por favor também me ajudar me <a href="http://workingwithrails.com/recommendation/new/person/13580-diego-carrion">recomendando</a> no <a href="http://workingwithrails.com/">Working With Rails</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/05/09/plugins-de-remarkable-para-actsastaggableon-paperclip-e-thinkingsphinx/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paginação dos últimos registros em Rails com will_paginate_latests</title>
		<link>http://www.mouseoverstudio.com/blog/2008/11/15/paginacao-dos-ultimos-registros-em-rails-com-will_paginate_latests/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/11/15/paginacao-dos-ultimos-registros-em-rails-com-will_paginate_latests/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 04:31:51 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[will_paginate]]></category>

		<category><![CDATA[will_paginate_latests]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=153</guid>
		<description><![CDATA[will_paginate é uma gem que ajuda a paginar um modelo em dois simples passos. Um dos dois passos, exatamente o primeiro, consiste em selecionar os registros que irão ser mostrados na paginação, podendo especificar a página para a qual estamos solicitando os dados e a ordem em que devem ser ordenados.
A motivação
No processo de paginação, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/mislav/will_paginate/tree/master">will_paginate</a> é uma gem que ajuda a paginar um modelo em dois simples passos. Um dos dois passos, exatamente o primeiro, consiste em selecionar os registros que irão ser mostrados na paginação, podendo especificar a página para a qual estamos solicitando os dados e a ordem em que devem ser ordenados.</p>
<p><strong>A motivação</strong></p>
<p>No processo de paginação, muitas vezes queremos trabalhar com as ultimas ocorrências de um modelo (comentários, posts, twitts, tickets, etc), pelo que terminamos executando algo assim:</p>
<pre class="prettyprint">Android.paginate(:page => params[:page], :order => 'id DESC')</pre>
<p><strong>O problema</strong></p>
<p>O código mostrado não é ruim, mas eu me senti criando código repetitivo é decidi então criar um método que encapsulasse o processo e torne o código um pouco mais legível.</p>
<p>Minha primeira intenção foi adicionar um método chamado <em>paginate_latests</em> na classe <em>ActiveRecord::Base</em>, mas eu queria que o método criado pegasse o valor de <em>params[:page]</em> como convenção e <em>params</em> é uma variável que existe a nível do controller, pelo que essa não era uma opção.</p>
<p>Minha segunda intenção foi adicionar um método na classe <em>ActionController::Base</em>, de tal modo que eu tenha acesso à variável <em>params</em> e consiga delegar o processo para o método criado em <em>ActionController::Base</em> pela gem. Num primeiro momento pensei em criar um fork da gem will_paginate e adicionar esse comportamento, mas o problema com isto é que a intenção da gem é ser agnóstica, ser independente de algum framework, e meu interesse se reduzia ao Rails.</p>
<p><strong>A solução</strong> </p>
<p>Como quando pensamos em Ruby criamos gems e quando pensamos em Rails criamos plugins, criei um plugin com o comportamento desejado, um plugin o qual chamei de <a href="http://github.com/dcrec1/will_paginate_latests/tree/master">will_paginate_latests</a>. Em poucas palavras, will_paginate_latests é um plugin que nos permite executar o seguinte código em nossos controllers:</p>
<pre class="prettyprint">paginate_latests :androids</pre>
<p>O código fica bem claro e a pagina não precisa ser especificada devido a que ela é automaticamente pega de <em>params[:page]</em>.</p>
<p><strong>Instalação</strong></p>
<p>Para instalar o plugin basta executar na raiz do projeto Rails:</p>
<pre class="prettyprint">script/plugin install git://github.com/dcrec1/will_paginate_latests.git</pre>
<p>O plugin will_paginate_latests utiliza a gem will_paginate pelo que ela devera estar instalada no sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/11/15/paginacao-dos-ultimos-registros-em-rails-com-will_paginate_latests/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Plugin in_place_edit agora com suporte a i18n</title>
		<link>http://www.mouseoverstudio.com/blog/2008/08/09/plugin-in_place_edit-agora-com-suporte-a-i18n/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/08/09/plugin-in_place_edit-agora-com-suporte-a-i18n/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 03:49:26 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[comunidade]]></category>

		<category><![CDATA[i18n]]></category>

		<category><![CDATA[in_place_edit]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=114</guid>
		<description><![CDATA[Muitos de vocês já devem conhecer o plugin oficial do Rails chamado in_place_editing, o qual permite transformar textos em campos editáveis, como é mostrado aqui.
Eu estava utilizando ele numa aplicação que estou fazendo com suporte a internacionalização mas como ele não suporta tal funcionalidade ficava um pouco feio: todo o texto se encontrava em português [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos de vocês já devem conhecer o plugin oficial do Rails chamado <a href="http://github.com/rails/in_place_editing/tree/master">in_place_editing</a>, o qual permite transformar textos em campos editáveis, como é mostrado <a href="http://github.com/madrobby/scriptaculous/wikis/ajax-inplaceeditor">aqui</a>.</p>
<p>Eu estava utilizando ele numa aplicação que estou fazendo com suporte a internacionalização mas como ele não suporta tal funcionalidade ficava um pouco feio: todo o texto se encontrava em português e os botoes do campo editável em inglês. Foi por tal motivo que decidi meter a mão e terminei criando um fork do plugin, dessa vez com suporte a i18n. </p>
<p>O novo plugin com suporte a i18 se encontra <a href="http://github.com/dcrec1/in_place_editing/tree/master">aqui</a> e para ser utilizado basta adicionar as mensagens nos arquivos para cada <em>locale</em> no formato <em>in_place_editing.text.xxx</em>. Segue um exemplo:</p>
<pre class="prettyprint">{
  :'pt-BR' => {
    ...
    :in_place_editing => {
      :text => {
        :cancel => "cancelar",
        :loading => "carregando...",
        :save => "salvar",
        :saving => "salvando..."
      }
    }
  ...
  }
}</pre>
<p>O plugin ira procurar as mensagens para o locale I18n.locale mas caso outro seja o desejado ele pode ser especificado como parâmetro:</p>
<pre class="prettyprint">in_place_editor('some_input',
        :url => {:action => 'update_value'},
        :locale => 'es-PE')</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/08/09/plugin-in_place_edit-agora-com-suporte-a-i18n/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
