Маршруты с тире `-` вместо подчеркивания` _` в Ruby on Rails

88

Я хочу, чтобы в моих URL-адресах в качестве разделителей слов использовалось тире -вместо подчеркивания _. Например controller/my-actionвместо controller/my_action.

Меня удивляют две вещи:

  1. Google et al. продолжать различать их.
  2. В этом Ruby on Rails нет простого глобального параметра конфигурации, который можно было бы сопоставить -с _маршрутизацией. Или нет?

Лучшее решение - использовать :asили именованный маршрут.

Моя идея состоит в том, чтобы изменить маршрутизацию Rails, чтобы проверить эту глобальную конфигурацию и изменить -ее _перед отправкой в ​​действие контроллера.

Есть ли способ лучше?

pduey
источник
Я также предпочитаю тире подчеркиванию в URL-адресах (а также в идентификаторах, именах и классах элементов html / css), но я не пытался реализовать это. Я бы сначала перешел на rails 3, а затем стал бы беспокоиться об этом, потому что в rails 3 есть много радикальных обновлений промежуточного программного обеспечения и маршрутизации.
yfeldblum
Спасибо, Правосудие. Я подожду, пока не обновлюсь и не познакомлюсь с v3.
pduey

Ответы:

74

В Rails 3 и новее вы можете сделать следующее:

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

Другой вариант - изменить Rails через инициализатор. Я не рекомендую это делать, так как в будущих версиях это может сломаться (edit: не работает в Rails 5).

:pathЛучше использовать, как показано выше.

# 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
Sandstrom
источник
1
Я новичок в Rails. В какой файл вы бы добавили такую ​​строку?
Алан В. Смит,
5
должен быть лучший и быстрый способ преобразовать все маршруты с подчеркиванием в дефисы
carbonr
2
@carbonr как насчет примера, который я только что добавил? :)
Sandstrom
@sandstrom вот и все! милая!
carbonr
3
К сожалению, этот патч обезьяны больше не работает в Rails 5. Это уничтожит все, кроме #index и #create, которые останутся подчеркиванием и будут создавать неприятные ошибки. Если у кого-то есть обновленный скрипт для Rails 5, мы будем очень признательны.
Келси Ханнан
3

Вы можете перегрузить имена контроллеров и действий, чтобы использовать тире:

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

Вы можете протестировать в консоли:

rails routes -g my_resources
my_method_my_resources GET  /my-resources/my-method(.:format) my_resources#my_method
Лев Лукомский
источник
2

Вы можете использовать именованные маршруты. Это позволит использовать «-» в качестве разделителей слов. В routes.rb,

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

Теперь URL-адреса типа http: // my_application / abc будут переходить к указанному контроллеру и действию.

Также для создания динамических URL

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

в этом случае 'id1, id2 и id2 будут переданы как параметры http для действия

В твоих действиях и взглядах,

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

будет оценивать URL-адрес http: // my_application / val1-val2-val3 .

Кан
источник
3
Я хочу избежать ручного обслуживания маршрутизации, так как названные маршруты отсутствуют. Я просто хочу, чтобы маршрутизация рельсов полностью заменила меня и сохранила мои файлы конфигурации.
pduey
2

если вы используете подчеркивания в контроллере и в файле просмотра, просто используйте дефисы в своем файле маршрутов, и он будет работать.

получить 'blog / example-text' это мой маршрут для этого контроллера

def example_text end <- это мой контроллер

а example_text.html.erb - это файл

а это фактическая ссылка site.com/blog/example-text

я подумал, что это работает для меня, и это более эффективно, чем подчеркивает SEO

Neinx
источник