Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

CRUD Основы разработки на Ruby on Rails

Программа урока

  • С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

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Разработчик на Ruby on Rails
Профессия
c опытом
Создание веб-приложений со скоростью света
2 февраля 5 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу