Маршруты с Dash `-` Вместо Underscore` _` в Ruby on Rails
Я хочу, чтобы мои URL-адреса использовали тире -
вместо подчеркивания _
как разделители слов. Например controller/my-action
вместо controller/my_action
.
Я удивляюсь двум вещам:
- Google и др. продолжают различать их.
- В Ruby on Rails нет простого глобального параметра конфигурации для сопоставления
-
- _
в маршрутизации. Или это?
Лучшим решением для меня является использование :as
или именованного маршрута.
Моя идея - изменить маршрутизацию Rails, чтобы проверить эту глобальную конфигурацию и изменить -
на _
перед отправкой на действие контроллера.
Есть ли лучший способ?
Ответы
Ответ 1
С Rails 3 и более поздними версиями вы можете сделать следующее:
resources :user_bundles, :path => '/user-bundles'
Другой вариант - изменить Rails через инициализатор.
Я не рекомендую это, так как он может ломаться в будущих версиях.
Использование :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
Ответ 2
Вы можете использовать именованные маршруты. Это позволит использовать "-" в качестве разделителей слов. В routes.rb,
map.name_of_route 'a-b-c', :controller => 'my_controller', :action => "my_action"
Теперь URL-адреса, такие как http://my_application/a-b-c, будут направлены на указанный контроллер и действие.
Кроме того, для создания динамических URL
map.name_of_route 'id1-:id2-:id3', :controller => 'my_controller', :action => "my_action"
в этом случае 'id1, id2 и id2 будут переданы как http params для действия
В ваших действиях и представлениях
name_of_route_url(:id1=>val1, :id2=>val2, :id3=>val3)
будет оценивать url 'http://my_application/val1-val2-val3'.
Ответ 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
Ответ 4
если вы используете символы подчеркивания в контроллере и файл просмотра, а затем просто используйте тире в файле маршрутов, и он будет работать.
get 'blog/example-text' это мой маршрут для этого контроллера
def example_text
end < - это мой контроллер
и example_text.html.erb - это файл
и это фактическая ссылка site.com/blog/example-text
Я понял, что это работает для меня, и это более эффективно, чем подчеркивает SEO мудрый