Rails Routes — косая черта против хеш-символа

В чем разница между использованием символа косой черты и символа фунта (знака решетки) в маршрутизации URL-адресов и рельсов?

Эти работы

get "/static_pages/about"
get 'about', to: 'static_pages#about', as: :about

Это не

get "/static_pages#about"
get 'about', to: 'static_pages/about', as: :about
get 'about', to: '/static_pages#about', as: :about

Какой код управляет этим поведением и в чем его более глубокая причина?

ОТВЕЧАТЬ:

(Два человека ответили на него очень хорошо, и мне было трудно выбрать, какой из них отметить как принятый ответ. Я хочу изложить свое понимание ответа другим способом, который может помочь людям.)

Как только вы используете символ /, строка распознается как строка URL-адреса, добавленная к базовому URL-адресу. Таким образом, символ «#» будет интерпретироваться как часть URL-адреса, а URL-адреса не любят принимать символы «#».

В случае отсутствия символа / первое слово каким-то образом распознается как имя контроллера, за которым следует символ «#» и имя действия.


person ahnbizcad    schedule 27.01.2014    source источник


Ответы (2)


# в to: 'static_pages#about' означает about действие static_pages_controller. Синтаксис controller#action.

Когда вы определяете get "/static_pages#about", static_pages#about становится контроллером для маршрута, т. е. # — это всего лишь символьный литерал, а #about не означает действие about. Вы должны получить ошибку missing :controller, если контроллер static_pages#about не существует.

Следующее определение маршрута дает вам /about путь, который сопоставляется с static_pages/about действием about контроллера, где static_pages может быть либо пространством имен, либо областью действия.

get 'about', to: 'static_pages/about', as: :about

Следующий маршрут недействителен и должен вызвать ошибку из-за косой черты / в начале параметра to.

get 'about', to: '/static_pages#about', as: :about
person vee    schedule 27.01.2014
comment
Что означает слово как: делать? - person user3180; 26.11.2016
comment
@Richard, он позволяет указать имя маршрута. В приведенных выше примерах as: :about позволяет использовать хелперы about_path и about_url. - person vee; 26.11.2016

В ruby ​​символ решетки обычно предшествует имени метода экземпляра класса. См. левую боковую панель страницы документации класса Array (http://www.ruby-doc.org/core-2.1.0/Array.html).

get "/static_pages#about" не работает, потому что #about не является частью URL-адреса.

get 'about', to: 'static_pages/about', as: :about не работает, потому что /about не указывает, какой метод контроллера следует вызывать.

get 'about', to: '/static_pages#about', as: :about не работает из-за предшествующей косой черты перед static_pages.

person Nicolas Garnil    schedule 27.01.2014