Rotas com traço `-` em vez de sublinhado` _` em Ruby on Rails


88

Quero que meus urls usem traço em -vez de sublinhado _como separadores de palavras. Por exemplo, em controller/my-actionvez de controller/my_action.

Estou surpreso com duas coisas:

  1. Google et al. continue a distingui-los.
  2. Que Ruby on Rails não tem um simples, parâmetro de configuração global para mapear -para _no roteamento. Ou não é?

A melhor solução que tenho é usar :asuma rota nomeada.

Minha ideia é modificar o roteamento do Rails para verificar essa configuração global e mudar -para _antes de enviar para uma ação do controlador.

Existe uma maneira melhor?


Eu também prefiro travessões a sublinhados em urls (bem como em ids de elemento html / css, nomes e classes), mas não tentei implementá-lo. Eu migraria para o rails 3 primeiro e depois me preocuparia com isso porque o rails 3 tem muitas atualizações drásticas de middleware e roteamento.
yfeldblum

Obrigado Justice. Vou esperar até fazer upgrade e me familiarizar com a v3.
pduey

Veja este artigo sobre Rotas Hifenizadas no Rails
Yarin

Respostas:


74

Com Rails 3 e posterior, você pode fazer assim:

resources :user_bundles, :path => '/user-bundles'

Outra opção é modificar o Rails, através de um inicializador. Eu não recomendo isso, pois pode falhar em versões futuras (editar: não funciona no Rails 5).

Usar :pathcomo mostrado acima é melhor.

# Using private APIs is not recommended and may break in future Rails versions.
# https://github.com/rails/rails/blob/4-1-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L1012
#
# config/initializers/adjust-route-paths.rb
module ActionDispatch
  module Routing
    class Mapper
      module Resources
        class Resource
          def path
            @path.dasherize
          end
        end
      end
    end
  end
end

1
Eu sou novo em Rails. Em qual arquivo você adicionaria uma linha como esta?
Alan W. Smith

5
tem que haver uma maneira melhor e mais rápida de converter todas as rotas que têm underline em hífens
carbonr

2
@carbonr e o exemplo que acabei de adicionar? :)
sandstrom

@sandstrom é isso! doce!
carbonr

3
Infelizmente, esse patch de macaco não funciona mais no Rails 5. Isso irá dasherize tudo, exceto #index e #create, que permanecerá como sublinhado e criará bugs desagradáveis. Se alguém tiver um script atualizado para Rails 5, ficaria muito grato.
Kelsey Hannan

3

Você pode sobrecarregar os nomes do controlador e da ação para usar travessões:

# config/routes.rb
resources :my_resources, path: 'my-resources' do
  collection do
    get 'my-method', to: :my_method
  end
end

Você pode testar no console:

rails routes -g my_resources
my_method_my_resources GET  /my-resources/my-method(.:format) my_resources#my_method

2

Você pode usar rotas nomeadas. Isso permitirá usar '-' como separadores de palavras. Em routes.rb,

map.name_of_route     'a-b-c',       :controller => 'my_controller', :action => "my_action"

Agora, urls como http: // my_application / abc iriam para o controlador e a ação especificados.

Além disso, para criar urls dinâmicos

map.name_of_route    'id1-:id2-:id3',       :controller => 'my_controller', :action => "my_action"

neste caso 'id1, id2 e id2 seriam passados ​​como parâmetros http para a ação

Em suas ações e visões,

name_of_route_url(:id1=>val1, :id2=>val2, :id3=>val3) 

seria avaliado como url ' http: // my_application / val1-val2-val3 '.


3
Eu quero evitar a manutenção manual do roteamento, então as rotas nomeadas estão fora. Eu só quero que o roteamento de trilhos me substitua no atacado e mantenha meus arquivos de configuração compactos.
dia

2

se você usar sublinhados em um controlador e um arquivo de visualização, use apenas travessões em seu arquivo de rotas e funcionará.

get 'blog / example-text' este é o meu caminho para este controlador

def example_text end <- este é meu controlador

e example_text.html.erb é o arquivo

e este é o link real site.com/blog/example-text

percebi que isso funciona para mim e é mais eficaz do que ressaltar o SEO

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.