Цель данного учебного пособия состоит в том, чтобы объяснить, в тоне новичка, как сопоставление URL происходит в приложении Rails. Я не смогу охватить всю информацию о Rails Routing, но постараюсь рассказать об основных аспектах. Эта часть руководства будет посвящена простым маршрутам, а следующая часть — ресурсным маршрутам.
Система маршрутизации Ruby on Rails обрабатывает запросы уникальным способом. Он проверяет URL входящих запросов и определяет действие контроллера, отвечающее за обработку каждого запроса. При этом отображении используется специальный синтаксис, указанный в файле маршрутов, config / rout.rb. Этот файл маршрутов контролирует каждый аспект URL вашего веб-приложения, поэтому важно, чтобы мы изучили его.
Файл Rails Routes
Сгенерированный файл содержит инструкции о том, как его можно использовать. Оставим это и пойдем копаться в создании маршрутов.
Создание регулярного маршрута
Основным средством создания маршрута является сопоставление URL-адреса с контроллером и действие. Когда маршрутизатор Rails видит запрос, он отправляет его действию контроллера, соответствующему URL-адресу.
Итак, URL выглядит так:
/books/2
Будет отображено действие контроллера, если маршрут определен как:
get 'books/:id' => 'books#show'
Это сокращение для:
get 'books/:id' to: 'books/show'
Здесь контроллером будет BooksController
и будет метод show
. Следующее направление действий осуществляется контроллером. Вы должны отметить шаблон, который мы использовали при вызове контроллера и метода действия
books#show
Это шаблон, который вы будете использовать в этом сценарии. Контроллер находится во множественном числе, и перед методом стоит знак #
который в Ruby означает, что вы говорите о методе экземпляра. Вы можете быть озадачены :id
в приведенных выше примерах, вы можете быть уверены, что я не оставлю вас в неведении об этом 🙂
Нет никакого волшебства в том, как это обрабатывается. Когда к вашему приложению делается запрос, Rails берет все параметры, которые идут с ним, и делает их доступными в специальном хеше, называемом params
который вы можете использовать в вашем контроллере. Если URL-адрес запроса выглядит следующим образом: http: // sitepointbooks.com / books / 15`, маршруты, которые его обрабатывают, будут выглядеть следующим образом:
get 'books/:id' => 'books#show'
Контроллер и метод действия будут выглядеть так:
class BooksController < ApplicationController def show @books = Book.find(params[:id]) end end
Это, очевидно, не единственный способ сделать это, просто ради необходимости я оставлю другой метод.
class BooksController < ApplicationController before_action :set_book, only: [:show] def show end private def set_book @books = Book.find(params[:id]) end end
Этот второй шаблон помогает вам поделиться общей настройкой среди других действий. Если в будущем вы увидите нечто подобное, вы должны это понять. После этого давайте рассмотрим что-нибудь интересное — корневой маршрут. Не забывайте то, о чем мы говорили выше, вам понадобятся эти знания в следующем разделе. Вы копаете?
Корневой путь
Корневой маршрут вызывается при запросе имени домена вашего веб-приложения в зависимости от правила, которое вы указали в файле маршрутов. Допустим, ваше доменное имя http://test.com
, когда кто-то пытается подключиться к нему, это правило выполняется. Теперь, каково правило?
Правило в вашем файле маршрутов может выглядеть так:
#config/routes.rb root to: 'welcome#index'
Как мы видели выше, это означает, что есть WelcomesController
и действие метода index
. Вот еще несколько примеров:
root to: 'pages#index' root to: 'welcome#show' root to: 'pages#home'
Вам просто нужно принять к сведению соглашение, используемое для именования корневых маршрутов, и все готово. Существует сокращенный формат для именования корневых маршрутов, и он выглядит так:
root 'pages#index'
Когда вы создаете новое приложение Rails и указываете свой браузер на корневой каталог, вам будет представлена корневая страница, даже если вы не определили корневой маршрут. Как это возможно? Если вы этого не видели, попробуйте, прежде чем продолжить чтение.
Откройте свой терминал и сгенерируйте новое приложение Rails. bundle install
ваши драгоценные камни и запустить свой rails server
. Запустите браузер и укажите http://localhost:3000
и вы увидите корневую страницу. Нет, это не волшебство 🙂 Позвольте мне объяснить, что происходит.
Если вы не определили корень для своего приложения, Rails по умолчанию Rails::WelcomeController
на внутренний Rails::WelcomeController
и отображает страницу приветствия. Это впиталось?
Вы можете спросить; «Где, черт возьми, эта страница приветствия на моей машине?» Вы можете найти код Rails::WelcomeController
на странице приветствия Rails по умолчанию .
Rails автоматически прекращает вызывать этот контроллер ( Rails::WelcomeController
) в тот момент, когда вы определяете корневой маршрут в файле маршрутов.
С учетом сказанного, давайте посмотрим на именованные маршруты.
Названные маршруты
Rails позволяют вам называть маршрут, используя параметр :as
. Вот один из способов сделать это:
get 'contact', to: 'pages#show', as: 'contact'
Это предоставляет вам помощников contact_url
и contact_path
которые вы можете вызывать в своем приложении, где это необходимо. Например, в ваших взглядах, как это:
Когда ссылка нажата, вызывается действие show
PagesController
. Путь, указанный в гиперссылке:
/contact
Другой пример связан с приложениями, требующими аутентификации. У вас может быть SessionsController
который обрабатывает аутентификацию, а действия new
и destroy
обрабатывают вход в систему и выход из нее соответственно. Именованные маршруты могут пригодиться в этом сценарии:
get 'login', to: 'sessions#new', as: 'login' get 'logout', to: 'sessions#destroy', as: 'logout'
Теперь вы можете использовать login_path
или logout_path
в вашем приложении, где это необходимо. Гиперссылки показывают:
/login /logout
Рельсы Маршруты Скоупинг
Rails предоставляет вам возможность группировать связанные маршруты и устанавливать для них параметры по умолчанию. Для этого мы используем метод scope
. Давайте посмотрим, как это работает, предположим, у вас есть это в вашем файле маршрутов:
get 'articles/new', to: 'articles#new' get 'articles/edit/:id', to: 'articles#edit' post 'articles/draft/:id', to: 'articles#draft'
В приведенном выше коде все маршруты отображаются на ArticlesController
. Используя scope
вы можете привести в порядок вещи и заставить их выглядеть так
scope controller: :articles do get 'articles/new' => :new get 'articles/edit/:id' => :edit post 'articles/draft/:id' => :draft end
Исходя из вышесказанного, мы даем системе маршрутизации инструкции нашего приложения для сопоставления маршрутов в блоке с ArticlesController
. Нам не нужно указывать это индивидуально для каждого из маршрутов. Мы также можем указать путь для использования, изменив код так:
scope path: '/articles', controller: :articles do get 'new' => :new get 'edit/:id' => :edit post 'post/:id' => :post end
Метод scope
, как мы видели выше, принимает опции :controller
и :path
. Он также принимает :as
вариант, поэтому мы можем иметь
scope :articles, as: 'posts' do get 'new' => :new end
Чтобы узнать больше о том, как работает область, проверьте следующие ссылки:
Рейк Маршруты
Как вы знаете, какие маршруты существуют в вашем приложении? Или я должен был спросить первым; Возможно ли узнать существующие маршруты в вашем приложении? Когда вы указываете в своем браузере маршрут, который не был добавлен в ваш файл маршрутов, вы получите страницу с ошибкой Rails Routing, которая выглядит как на картинке ниже:
Это страница 404 error
по умолчанию, которую вы увидите в среде разработки. В нем перечислены все маршруты, уже определенные в вашем приложении. Как показано на рисунке, вы можете переключаться между path_hlpers
и url_helpers
которые вы можете использовать в своем приложении, как это
<%= link_to "Login", login_path %>
Вы также можете найти маршруты, определенные в вашем приложении, используя стандартную задачу Rake, которая входит во все приложения Rails. Чтобы увидеть, как это работает, откройте файл маршрутов приложения Rails, созданного вами ранее, и вставьте следующие коды:
#config/routes.rb Rails.application.routes.draw do resources :books end
Введите эту команду в свои терминальные rake routes
и нажмите ENTER. Это должно произвести то, что я имею ниже:
Prefix Verb URI Pattern Controller#Action books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy
Давайте продолжим, отредактируйте файл маршрутов, чтобы он выглядел так:
#config/routes.rb Rails.application.routes.draw do resources :books root "welcome#home" get 'login', to: 'sessions#new', as: 'login' get 'logout', to: 'sessions#destroy', as: 'logout' scope path: '/articles', controller: :articles do get 'new' => :new get 'edit/:id' => :edit post 'post/:id' => :post end end
Запустите rake routes
и проверьте вывод. Это должно выглядеть так:
Prefix Verb URI Pattern Controller#Action books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy root GET / welcome#home login GET /login(.:format) sessions#new logout GET /logout(.:format) sessions#destroy new GET /articles/new(.:format) articles#new GET /articles/edit/:id(.:format) articles#edit POST /articles/post/:id(.:format) articles#post
Результаты всегда перечислены в этом формате:
- Название маршрута.
- Используется HTTP-глагол.
- Шаблон URL для соответствия.
- Параметры маршрутизации для маршрута.
Вы можете ограничить результат rake routes
маршрутов маршрутами данного контроллера. Запустите эту команду в своем терминале: CONTROLLER=books rake routes
и посмотрите результат.
Вывод
На этом этапе вы понимаете основные аспекты системы маршрутизации Rails. В следующей части мы поговорим о ресурсных маршрутах. Спасибо за прочтение 🙂