Учебники

Ruby on Rails 2.1 — Система маршрутов

Rails анализирует URL-адрес, чтобы определить контроллер, действие и параметры для запроса. С помощью маршрутизации Rails части URL могут указывать дополнительные параметры, и весь процесс маршрутизации находится под вашим контролем. Правила маршрутизации работают одинаково на любом веб-сервере.

Файл config / rout.rb лежит в основе системы маршрутизации Rails. Этот файл содержит правила, которые пытаются сопоставить путь URL-адреса запроса и определить, куда направить этот запрос. Правила проверяются в порядке их определения в файле. Первое правило, которое соответствует пути URL запроса, определяет судьбу этого запроса.

Система маршрутизации на самом деле делает две вещи —

  • Он отображает запросы к методам действий внутри контроллеров.

  • Он записывает URL-адреса для использования в качестве аргументов таких методов, как link_to, redirect_to и form_tag.

Он отображает запросы к методам действий внутри контроллеров.

Он записывает URL-адреса для использования в качестве аргументов таких методов, как link_to, redirect_to и form_tag.

Таким образом, система маршрутизации знает, как превратить URL запроса посетителя в последовательность контроллера / действия. Он также знает, как создавать строки URL на основе ваших спецификаций.

Рассмотрим следующий маршрут, установленный Rails при создании приложения:

map.connect ':controller/:action/:id'

Этот маршрут заявляет, что он ожидает, что запросы состоят из : контроллера, за которым следует : действие, которое, в свою очередь, получает some : id .

Если вы получите входящий запрос на «http: // localhost: 3000 / book / edit / 2», он будет отображен следующим образом:

params = {  :controller => 'book',
   :action     => 'edit',
   :id         => '2'
}

Таким образом, маршрутизация по умолчанию (если вы не изменяете правила маршрутизации) —

http://<base-url>/<controller>/<action>/<id>

URL-адрес, например http://www.example.com/book/update/20, вызывает метод обновления (действие) в классе BooksController (контроллер) с параметром id, установленным в значение 20.

Следующий блок кода установит книгу в качестве контроллера по умолчанию, если не указано иное. Это означает, что посещение «/» вызовет контроллер книги .

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id',:controller => 'book'
end

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

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id', 
   :action => 'edit',:controller => 'book'
end

Теперь вы можете редактировать все методы внутри контроллера книги, чтобы редактировать книгу с идентификатором 20 следующим образом:

http://localhost:3000/2

Приоритет маршрута

Приоритеты маршрутов определяются порядком появления маршрутов в файле rout.rb. Приоритет идет сверху вниз.

Последний маршрут в этом файле имеет самый низкий приоритет и будет применяться последним. Если не найдено ни одного маршрута, возвращается 404.

Изменение маршрута по умолчанию

Вы можете изменить маршрут по умолчанию в соответствии с вашими требованиями. В следующем примере мы собираемся поменять контроллер и действовать следующим образом:

# Install the default route as the lowest priority.
map.connect ':action/:controller/:id'

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

http://localhost:3000/action/controller/id

Не очень логично размещать действие и контроллер в такой последовательности. Исходный маршрут по умолчанию (по умолчанию по умолчанию) лучше и рекомендуется.

Маршрут Ante-Default

Маршрут «ante-default» выглядит следующим образом —

map.connect ':controller/:action/:id.:format'

Формат.: В конце соответствует буквальной точке и значению «формат» подстановочного знака после поля id. Это означает, что он будет соответствовать, например, такому URL —

http://localhost:3000/book/show/3.xml

Здесь, внутри действия контроллера, ваш params [: format] будет установлен в xml.

Пустой маршрут

Пустой маршрут является своего рода противоположностью маршрута по умолчанию. В только что созданном файле rout.rb пустой маршрут закомментирован, потому что для него нет универсального или разумного значения по умолчанию. Вам нужно решить, что должен делать этот ничего URL для каждого написанного вами приложения.

Вот несколько примеров довольно распространенных пустых правил маршрута.

map.connect '', :controller => "main", :action => "welcome"
map.connect '', :controller => "main"

Вот объяснение вышеуказанных правил —

  • Первый будет искать приветственное действие внутри основного контроллера, даже если вы наберете просто http: // localhost: 3000.

  • Последний подключится к http: // localhost: 3000 / main / index. Здесь index — действие по умолчанию, когда ничего не указано.

Первый будет искать приветственное действие внутри основного контроллера, даже если вы наберете просто http: // localhost: 3000.

Последний подключится к http: // localhost: 3000 / main / index. Здесь index — действие по умолчанию, когда ничего не указано.

В Rails 2.0 представлен метод сопоставления с именем root, который становится правильным способом определения пустого маршрута для приложения Rails, например:

map.root :controller => "homepage"

Определение пустого маршрута дает людям возможность взглянуть, когда они подключаются к вашему сайту, используя только доменное имя.

Названные маршруты

Продолжая разработку приложения, вы, вероятно, будете иметь несколько ссылок, которые вы используете в своем приложении. Например, вы, вероятно, часто будете помещать ссылку на главную страницу списков. Вместо добавления следующей строки в ваше приложение, вы можете вместо этого создать именованный маршрут, который позволит вам ссылаться на сокращенную версию этой ссылки:

link_to 'Home', :controller => 'classified', :action => 'list'

Вы можете определить именованные маршруты следующим образом. Здесь вместо использования connect вы используете уникальное имя, которое вы можете определить. В этом случае маршрут называется домом . Остальная часть маршрута выглядит аналогично другим, которые вы создали.

map.home '', :controller => 'classified', :action => 'list'

Теперь вы можете использовать это в контроллерах или представлениях следующим образом —

<%= link_to 'Back', home_url %>

Здесь вместо перечисления действий : controller и :, с которыми вы будете связывать, вы вместо этого ставите название маршрута, за которым следует _url. Ваш пользователь не должен заметить никакой разницы. Именованная маршрутизация — это просто удобство для разработчика Rails, чтобы сэкономить некоторую типизацию. Вышеуказанный случай может быть записан без названного маршрута следующим образом:

<%= link_to 'Back', {:action => 'list'} %>

Красивые URL

Маршруты могут генерировать красивые URL. Например —

map.connect 'articles/:year/:month/:day',
   :controller => 'articles',
   :action     => 'find_by_date',
   :year       => /\d{4}/,
   :month      => /\d{1,2}/,
   :day        => /\d{1,2}/

# Using the route above, the url below maps to:
# params = {:year => '2005', :month => '11', :day => '06'}
# http://localhost:3000/articles/2005/11/06

Чтобы получить более подробную информацию о маршрутах, перейдите через ActionController :: Routing.