terça-feira, 26 de junho de 2012

Rails Rotas, permalinks e redirecionamento 301 ou dicas de otimização de SEO

Dica rápida após muito tempo com o blog parado. Resolvi passar para dicas mais diretas ao invés de conceitos mais sofisticados neste post.
Neste post quero falar sobre uma coisa muito útil para mecanismos de buscas que é a construção de url amigáveis.
No rails é muito fácil trabalhar com rotas customizadas e seu uso é bastante conhecido, porém quero tratar de erros que alguns programadores cometem e oferecer uma dica rápida para tornar mais fácil a manipulação de urls e indexação no google.

Use rotas nomeadas e os helpers do rails para criar links

Parece bastante óbvio o que disse, mas já vi diversas vezes códigos como:
  <a href="/paginas/1">....

Por que o código acima é ruim? Parece bastante óbvio que o código da sua view depende que a url /paginas/1 responda, caso você queira mudar este caminho terá que intervir em todos os lugares em que os links apontarem para este caminho. Agora imagine que sua aplicação tenha vários links assim. Torna-se muito trabalhoso mudar tantos links em tantas views.
Partindo disso, então como fazer para que sua aplicação seja mais flexível para mudança de links?

Deixe que o rails trabalhe por você

Isto lhe dará flexibilidade para mudar a rota quando quiser.
   routes.rb
   match "/paginas/:id", :as => "pagina"

   view.erb
   <% link_to pagina_path(pagina) do %>....<% end %>
    OU  
   routes.rb
   resources :paginas, :only => [:show]
   view.erb
   <a href="<% url_for(pagina) >" >....   
   <% link_to pagina do %>....<% end %>

Existem outras opções, mas o importante é que o caminho seja resolvido através dos helpers de rota, ..._path, url_for(...) ou link_to
Utilizando todos os links desta forma poderemos mudar a qualquer momento o caminho das rotas.
No exemplo anterior poderia substituir o paginas para p

   routes.rb
   match "/p/:id", :as => "pagina"

   view.erb
   <% link_to pagina_path(pagina) do %>....<% end %>
    OU  
   routes.rb
   resources :paginas,:path => "/p", :only => [:show]
   view.erb
   <a href="<% url_for(pagina) >" >....   
   <% link_to pagina do %>....<% end %>
 

Permalinks, como fazê-los de forma simples?

É incrível o quanto é simples a criação de permalinks em rails , basta sobrescrever o método to_param da classe ActiveRecord em questão.

 class Pagina < ActiveRecord::Base
   validates :titulo, :presence => true;
   
   def to_param
     "#{id}-#{titulo.to_s.parameterize}"
   end
   
  end

Pronto é só isto, o método find da classe ActiveRecord do rails
irá funcionar normalmente, pois ele irá 'pegar' somente a parte inteira da url e buscará o registro pelo id, como se nada tivesse acontecido.
É possível ainda, se for de seu interesse, criar um campo somente para permalinks, basta substituir o titulo no método to_param pelo campo.

   class Pagina < ActiveRecord::Base
   validates :titulo,:permalink, :presence => true;
   
   def to_param
     "#{id}-#{permalink.to_s.parameterize}"
   end
   
  end

Mecanismos de buscas e urls duplicadas, como resolver?

Ponto importante, quando desenvolvemos aplicações web, geralmente nos preocupamos com o google, e a solução acima pode não ser muito adequada, pois o google poderá encontrar as mesmas páginas em urls diferentes e ele as tratará como conteúdo duplicado.
ex: paginas/1-titulo1 e paginas/1-mudei-o-titulo Como resolver este inconveniente? Simples, basta fazer um teste no before_filter do controller e utilizar redirecionamento com status 301 quando necessário.

Mas espera aí, o que é status 301 ?

Status 301 é um código de resposta do protocolo HTTP e seu significado é movido permanentemente, ou seja, é um redirecionamento permanente, isto significa que o index do google deverá procurar esta mesma página em outro lugar.

Vejamos o exemplo do controlador abaixo, lembrando que estou utilizando a gem inherited_resources, não vou entrar em detalhes sobre esta gem apenas dizer que é excelente.

class PaginasController < ApplicationController
    inherited_resources
    actions :show
  
    before_filter do
      if request.get? && params.key?(:id)
        if resource.to_param != params[:id]
           params[:id] = resource.to_param
           return redirect_to url_for(params), :status => 301 
        end 
      end
    end

  end

Bem o que acontece neste código é que: definí a action :show, automáticamente tratada pelo inherited_resources e definí um filtro before_filter.
Neste filtro, quando a chamada for por método GET se o parametro ID for diferente do método to_param, isto significa que está acessando um permalink "errado", redireciona com status 301 para o permalink correto.



Bem por hoje é isto, espero que este post seja para tirar ferrugem e retomar este blog. Dicas, sugestões e críticas são bem vindas. Deixe seu comentário. Espero que este post tenha sido agradável, útil e de fácil compreensão.

quarta-feira, 15 de junho de 2011

Dependency Injection Design Pattern

Olá,

Hoje falo sobre o design pattern - Dependency injection muito útil por promover baixo acoplamento.

A Injeção de Dependência basicamente diz: não faça uma classe dependente de outro, injete a dependência. Mas como? dirão alguns. É simples. Imagine a
seguinte PHP.

class Car {
   private $driver = null;

   public function __construct() {
      $this->driver = new Driver();
   }

   public function crash() {
      $this->driver->saySomething();
   }
}

Neste momento a classe Car depende do da classe Driver, porque você precisa da classe Driver para instanciar Car. Depois que você fez isso e tudo funciona bem, o seu chefe vem e lhe diz que é preciso distinguir entre os condutores do sexo feminino e motoristas do sexo masculino. Porque se você chamar o crash(), um motorista do sexo feminino seria simplesmente dizer: "você me bateu!" e um motorista do sexo masculino diria algo como: "cara eu tenho uma arma".

sábado, 4 de setembro de 2010

Design Pattern Observer

Salve!

Continuando a série de posts sobre design pattern um assunto muito interessante para desenvolvimento e projeto de softwares: Design Patterns.

O que é design pattern ?

Design Pattern
ou padrões de projetos de software são soluções catalogadas para problemas recorrentes. Existem diversos deles, sendo que cada um tem seu objetivo, que pode ser reuso, performance, manutenibilidade, etc.

Neste post pretendo mostrar um padrão de projeto bastante difundido, o Observer.

sábado, 28 de agosto de 2010

Que venha o Zend 2.0

Olá pessoal,

Como desenvolvedor Zend Framework não posso mal posso esperar pela versão 2.0 deste framework.
Esta nova versão trará várias alterações como a utilização dos novos recursos do php 5.3 como namespaces e closures.
Recentemente ví que a versão de desenvolvimento já foi lançada
para quem quiser baixar a versão de desenvolvimento link é:

terça-feira, 30 de março de 2010

Design Pattern Template Method, aumente sua produtividade

Salve salve, leitor.

Durante minha busca sobre Design Patterns (padrões de projeto) e técnicas avançadas sobre desenvolvimento, experimentei diversos Design Patterns, alguns muito específicos e outros bem práticos para o uso no dia-a-dia.

Este é um Design Pattern muito útil para agilizar o desenvolvimento de tarefas rotineiras.

sábado, 6 de março de 2010

Design Pattern Adapter aplicado a Frameworks de terceiros

Caro leitor,
Venho compartilhar um pouco da minha experiência com design patterns para desenvolvimento.

Com a crescente demanda de tempo e produtividade, surgiu o mercado de Frameworks terceirizados, eles fornecem uma base de código que agiliza e melhora o desenvolvimento das aplicações.