Подтвердить что ты не робот

Маршруты с Dash `-` Вместо Underscore` _` в Ruby on Rails

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

Я удивляюсь двум вещам:

  • Google и др. продолжают различать их.
  • В Ruby on Rails нет простого глобального параметра конфигурации для сопоставления - - _ в маршрутизации. Или это?

Лучшим решением для меня является использование :as или именованного маршрута.

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

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

4b9b3361

Ответ 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 мудрый