Создание контроллера с экшеном.
bin/rails g controller pages index
bin/rails g controller pages index
Running via Spring preloader in process 82534
create app/controllers/pages_controller.rb
route get 'pages/index'
invoke erb
create app/views/pages
create app/views/pages/index.html.erb
invoke test_unit
create test/controllers/pages_controller_test.rb
invoke helper
create app/helpers/pages_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/pages.scss
Отмена изменений генератора
bin/rails d controller pages index
При выполнении генератора будет добавлен роут в config/routes.rb
Rails.application.routes.draw do
get 'pages/index'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
Создание котроллера с экшеном без создания роута в config/routes.rb bin/rails g controller pages index --skip-routes
Показать список роутов bin/rails routes
Показать только те, что содержат pages bin/rails routes -g pages
# config/routes.rb
Rails.application.routes.draw do
root 'pages#index'
# get 'pages/about', to: 'pages#about'
# get 'pages/term_of_service', to: 'pages#term_of_service'
# page_path GET /pages/:id(.:format) pages#show
# ресурсный роутинг позволяет создавать роуты динамически
resources :pages, only: :show
end
Все контроллеры приложения Rails наследуются от контроллера, который наследуется от базового
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
end
# app/controllers/pages_controller.rb
class PagesController < ApplicationController
end
Вызов root 'pages#index'
позволяет добавить корневую страницу, которая будет обрабатываться контроллером PagesController
методом index()
# app/controllers/pages_controller.rb
class PagesController < ApplicationController
def index; end
end
<% #Пример комментария в erb %>
Знак = используется для отображения значений
params содержит переменные из пути, например /pages/:id - /pages/about
<%= params[:id] %>
<% 10.times do %>
Для конструкций знак = не используется.
<% end %>
Предположим есть шаблон и в нём выводятся ссылки
<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>
<p><a href="/pages/about">About</a></p>
<p><a href="/pages/term_of_service">Term of service</a></p>
Используется хелпер link_to
для формирования ссылок
<p><%= link_to "About", 'pages/about' %></p>
<p><%= link_to "Term of service", '/pages/term_of_service' %></p>
Rails создаёт для роутов хелперы для каждого урла, в их можно передать какие-либо параметры. Посмотреть созданные хелперы можно через bin/rails routes
и на странице с неверным роутом
<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>
Для получения ссылки на корневую страницу создается хелпер root_path
. Список хелперов можно посмотреть в списке роутов
Rails позволяет использовать базовый шаблон и отображать уникальный контент. Контент страницы будет выведен с помощью yield
. Шаблоны находятся в директории app/views/layouts.
Пример базового шаблона app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>ExampleApp</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
Страница app/views/pages/index.html.erb Содержит только уникальный контент
<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>
<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>
По соглашению Rails будет искать шаблоны по имени контроллера и метода. Так для метода index()
путь для вью будет app/views/pages/index.html.erb. В теле метода не нужно вручную указывать Вью.
class PagesController < ApplicationController
def index; end
end
<% # app/views/pages/index.html.erb >
<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>
<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>
Рендер другого шаблона ./_about.html.erb
<%= render 'about' >
render partial
требует четкого указания пути и локальной передачи переменных. Обычный render использует переменные в том контексте запроса, в котором вызывается
<%= render partial: "pages/partial/links", locals: {} %>
Сам файл находится по следующиму пути — app/views/pages/partial/_links.html.erb
<p><%= link_to "Back", root_path %></p>
Вместо создания методов для каждой конкретной страницы можно использовать один метод. Вместо:
class PagesController < ApplicationController
def about; end
def term_of_service; end
def index; end
end
Используем метод show()
class PagesController < ApplicationController
def show; end
def index; end
end
Чтобы в будущем воспользоваться хелпером и удобно работать с урлами, используем ресурсный роутинг (подробнее о нём в следующих уроках):
Rails.application.routes.draw do
root 'pages#index'
# page_path GET /pages/:id(.:format) pages#show
resources :pages, only: :show
end
Ресурсный роутинг позволяет создавать роуты динамически. Имя страницы будет передаваться в параметрах путей. Например example.com/pages/tos
, где tos
— будет параметром ID страницы. У статических страниц будет загружаться вью app/views/pages/show.html.erb
<%= render params[:id] %>
А уникальный для каждой страницы контент находиться в своем шаблоне. Имя шаблона будет начинаться с нижнего подчёркивания
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу