domingo, 30 de setembro de 2007

Primeira oferta de emprego em Ruby on Rails em Portugal

Até ao momento foi a primeira oferta de emprego que tenho conhecimento para a posição Programador Ruby / Ruby on Rails.

A empresa é PrimeIT consulting.

Será esta a primeira oferta de muitas? Só o tempo o dirá...

domingo, 23 de setembro de 2007

Paginar utilizando AJAX

Perguntaram-me recentemente como paginar sem ter a necessidade de "carregar" novamente todo o layout da página. A resposta é bem simples, utilizar AJAX.

O exemplo que vou utilizar é o que está implementado na página http://complethotel.publituris.pt/entidades/alfa?letter=A

Como podem ver existe uma listagem de empresas que está paginada, 15 empresas por página.

Colocar a seguinte função no application_helper.rb:

def pagination_links_remote(paginator)
page_options = {:window_size => 2}
pagination_links_each(paginator, page_options) do |n|
options = {
:url => {:action => 'list', :params => @params.merge({:page => n})},
:update => 'table',
:before => "Element.show('spinner')",
:success => "Element.hide('spinner')"
}
html_options = {:href => url_for(:action => 'list', :params => @params.merge({:page => n}))}
link_to_remote(n.to_s, options, html_options)
end
end

Fonte do Código : http://wiki.rubyonrails.org/rails/pages/How+to+Paginate+With+Ajax


No controlador defino um método "list_alfa":

def list_alfa

@entidades_pages, @entidades= (paginate :entidades, :per_page => 15,
:order => 'entidades.nome ASC',
:conditions=> "entidades.nome LIKE '#{params[:letter]}%'")

render :partial => "list_alfa", :layout => false

end



Este método não faz mais do que uma query à base de dados, recebendo como parâmetro a letra pela qual queremos filtrar. Em seguida faz um render a um partial "list_alfa" e como queremos que o layout não seja carregado novamente para este partial colocamos layout=> false.

O Ruby on Rails tem algo fantástico que se chamam "partials" que não são mais que zonas da nossa página, ou seja uma parte de um todo. Todos os "partials" são identificados facilmente nas Views pois os ficheiros começam com "_", neste caso utilizo um partial chamado "_list_alfa.rhtml":

<% if @entidades_pages.page_count > 1%>
Pagina
<%= pagination_links_remote @entidades_pages %>
<%= image_tag("spinner.gif", :align => 'absmiddle',
:border => 0,
:id => 'spinner',
:style=> "display:none;")%>
<% end%>

( ... )

<% end %>


O "if" vai confirmar a necessidade de paginar, se o "page_count" for menor que 1 significa que existiram 15 ou menos resultados para apresentar não existindo necessidade de paginar. Em seguida é chamado o método "paginate_links_remote", que é responsável por apresentar os números de página com os respectivos links.

Muito simples!!


NOTA: Apenas coloquei o código que me pareceu mais importante. Portanto se tiverem problemas na implementação coloquem as vossas dúvidas.