Статьи

Углубленный взгляд на Basic Rails Routing

Цель данного учебного пособия состоит в том, чтобы объяснить, в тоне новичка, как сопоставление 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. В следующей части мы поговорим о ресурсных маршрутах. Спасибо за прочтение 🙂