Маршрути з тире `-` замість підкреслення` _` в Ruby on Rails


88

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

Мене дивують дві речі:

  1. Google та ін. продовжуйте їх розрізняти.
  2. Це Рубін на Rails не має простий, глобальний конфігураційний параметр для відображення -на _в маршрутизації. Або це?

Найкраще рішення, яке я маю - це використовувати :asабо вказаний маршрут.

Моя ідея полягає в тому, щоб змінити маршрутизацію Rails, щоб перевірити наявність цієї глобальної конфігурації та змінити -на _перед відправкою до дії контролера.

Чи є кращий спосіб?


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

Дякую Справедливості. Я затримаюся, поки не оновлюся і не познайомлюсь з v3.
pduey

Дивіться цю статтю про Дефісні маршрути в рейках
Ярін,

Відповіді:


74

За допомогою Rails 3 та пізніших версій ви можете робити наступне:

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

Інший варіант - змінити Rails за допомогою ініціалізатора. Однак я не рекомендую цього, оскільки це може зламатися в наступних версіях (редагувати: не працює в 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

1
Я абсолютно новий для Rails. У який файл ви б додали такий рядок?
Alan W. Smith

5
повинен бути кращий і швидший спосіб перетворити всі маршрути, на яких є нижня частина, у дефіси
carbonr

2
@carbonr як щодо прикладу, який я щойно додав? :)
sandstrom

@sandstrom це! солодко!
carbonr

3
На жаль, цей патч для мавп більше не працює в Rails 5. Це призведе до дашеризації всього, крім #index та #create, які залишаться підкресленням і створюватимуть неприємні помилки. Якщо хтось має оновлений сценарій для Rails 5, це буде дуже вдячний.
Kelsey Hannan

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

Ви можете використовувати названі маршрути. Це дозволить використовувати '-' як розділювачі слів. У маршрутах.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
Я хочу уникнути ручного обслуговування маршруту, тому названі маршрути вийшли. Я просто хочу, щоб маршрутизація рейок зробила мені заміну оптом і міцно тримала мої конфігураційні файли.
пдей

2

якщо ви використовуєте підкреслення в контролері та переглядаєте файл, то просто використовуйте тире у файлі маршрутів, і це буде працювати ..

get 'blog / example-text' це мій маршрут для цього контролера

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

і example_text.html.erb - це файл

і це фактичне посилання site.com/blog/example-text

Я вважав, що це працює для мене, і це ефективніше, ніж підкреслює SEO

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.