ArthurGeek.net

Rails, Mac... e Rock'n Roll!

Pôr do sol em São Paulo

Cansado daquele ";" horrível em sua url?

06 de Junho de 2007 às 15:02 · 1 comentário

Uma das coisas que eu mais gosto no Rails, é o rewriting das URLs, nada de ficar usando: dispatch.cgi?controller=people&action=edit&id=1, é simplesmente: /people/edit/1. É algo simples, é algo besta, mas vamos concordar, é muito mais fácil de lembrar e muito mais bonito. não? Porém, com o Rails 1.2 e o suporte à REST eu reclamo toda vez que olho para URLs assim:

/people/1;edit
/orders;recent

Que coisa feia esse ”;”!

Ainda bem que o Rails 2.0 voltará a usar a boa, velha e bonita ”/”! :)

Acompanhe como usar este recurso nos seus projetos sem precisar esperar pelo Rails 2.0!

O patch

Crie um arquivo chamado fix_resource_routing em /lib com o seguinte conteúdo:

module ActionController
  module Resources
    private
    def map_collection_actions(map, resource)
      resource.collection_methods.each do |method, actions|
        actions.each do |action|
          action_options = action_options_for(action, resource, method)
          map.named_route("#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}", action_options)
          map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}.:format", action_options)
        end
      end
    end

    def map_new_actions(map, resource)
      resource.new_methods.each do |method, actions|
        actions.each do |action|
          action_options = action_options_for(action, resource, method)
          if action == :new
            map.named_route("#{resource.name_prefix}new_#{resource.singular}", resource.new_path, action_options)
            map.named_route("formatted_#{resource.name_prefix}new_#{resource.singular}", "#{resource.new_path}.:format", action_options)
          else
            map.named_route("#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}", action_options)
            map.named_route("formatted_#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}.:format", action_options)
          end
        end
      end
    end

    def map_member_actions(map, resource)
      resource.member_methods.each do |method, actions|
        actions.each do |action|
          action_options = action_options_for(action, resource, method)
          map.named_route("#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}", action_options)
          map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}.:format",action_options)
        end
      end

      show_action_options = action_options_for("show", resource)
      map.named_route("#{resource.name_prefix}#{resource.singular}", resource.member_path, show_action_options)
      map.named_route("formatted_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}.:format", show_action_options)

      update_action_options = action_options_for("update", resource)
      map.connect(resource.member_path, update_action_options)
      map.connect("#{resource.member_path}.:format", update_action_options)

      destroy_action_options = action_options_for("destroy", resource)
      map.connect(resource.member_path, destroy_action_options)
      map.connect("#{resource.member_path}.:format", destroy_action_options)
    end

  end
end

Agora, no final do config/environment.rb adicione esta linha:

require 'fix_resource_routing'

Pronto! Agora nossas URLs voltaram a ficar bonitas como antes, e quando o Rails 2.0 sair, nossos permalinks não irão mudar!

Vi este patch em: Using Rails Edge-style resource actions now

Tags:··

  • 1 herval // 06 de Junho de 2007 às 17:59

    eu tinha vergonha de dizer em publico que achava aquele ponto e virgula pavoroso… ainda bem que o pai da criança decidiu achar tb ;)