Программа урока
- СRUD:
- создание, отображение, редактирование и удаление
- обработка параметров запроса (Strong parameters)
- валидации
- Обработка HTTP ошибок
Генерация метода index в контроллере articles
bin/rails g controller articles index
Генерация модели
bin/rails g model articles title:string body:text author
bin/rails db:migrate
Добавление аннотаций для моделей
# https://github.com/ctran/annotate_models
bundle
bin/rails g annotate:install
bundle exec annotate
В модели добавляется такое описание:
# == Schema Information
#
# Table name: articles
#
# id :integer not null, primary key
# author :string
# body :text
# title :string
# created_at :datetime not null
# updated_at :datetime not null
#
class Article < ApplicationRecord
end
Использование faker для заполнения таблиц
https://github.com/faker-ruby/faker
db/seeds.rb
10.times do |i|
article_index = i + 1
Article.create(
title: Faker::Lorem.sentence,
body: Faker::Lorem.paragraphs.join("\n\n"),
author: Faker::Name.unique.name
)
end
bin/rails db:seed
# Проверка в консоли
bin/rails c
pp Article.all # вывод всех созданных статей
bin/rails routes -g article
controllers/articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.order(created_at: :desc)
end
def show
@article = Article.find(params[:id])
end
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
# Flash сообщение
# Сообщение рендерится в базовом шаблоне app/views/layouts/application.html.erb
# https://api.rubyonrails.org/classes/ActionDispatch/Flash.html
flash[:success] = 'New article was successfully created'
# Выполняется новый полноценный запрос
redirect_to article_path(@article)
else
flash[:failure] = 'Article cannot be created'
# Отрисовывается форма создания, все параметры остаются
render :new, status: :unprocessable_entity
end
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
# Flash сообщение
# https://api.rubyonrails.org/classes/ActionDispatch/Flash.html
flash[:success] = 'Article was successfully updated'
# Выполняется новый полноценный запрос
redirect_to article_path(@article)
else
flash[:failure] = 'Article cannot be updated'
# Отрисовывается форма создания, все параметры остаются
render :edit
end
end
def destroy
@article = Article.find(params[:id])
if @article.destroy
# Flash сообщение
# https://api.rubyonrails.org/classes/ActionDispatch/Flash.html
flash[:success] = 'article was successfully deleted'
# Выполняется новый полноценный запрос
redirect_to root_path
else
flash[:failure] = 'Article cannot be deleted'
# Отрисовывается форма создания, все параметры остаются
redirect_to article_path(@article)
end
end
private
def article_params
# Требуем наличия ключа :article в params. Разрешаем использовать только некоторые ключи
params.required(:article).permit(:title, :body, :author)
end
end
controllers/articles_controller.rb
class ErrorsController < ApplicationController
# Для кастомного отображения ошибок
def not_found
render status: :not_found
end
def internal_server_error
render status: :server_error
end
end
config/routes.rb
Rails.application.routes.draw do
# Кастомные страницы для ошибок
# Также изменяем в config/application.rb конфиг
# https://guides.rubyonrails.org/v4.2.0/action_controller_overview.html#custom-errors-page
get '/404', to: 'errors#not_found'
get "/500", to: "errors#server_error"
root 'articles#index'
# Лучше использовать only, так как белые списки проще для понимания
resources :articles, only: [:show, :new, :create, :edit, :update, :destroy]
end
config/application.rb
module CrudExample
class Application < Rails::Application
config.load_defaults 6.1
config.exceptions_app = self.routes
end
end
config/environments/development.rb
Rails.application.configure do
# Show full error reports.
# Отображать подробный вывод ошибок
# При отключении опции рендерятся страницы public/404.html public/422.html public/500.html
config.consider_all_requests_local = false
end

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.