Наиболее используемые команды в Ruby on Rails
TimeWeb

Шпаргалка по Ruby on Rails

Ну вот и пришло мое время попробовать что-то новенькое. А именно: пересесть с PHP (Symfony 5 и WordPress) на Ruby on Rails.

Поскольку я, как никто другой, знаю, что в начале изучения любого языка программирования очень важно иметь под рукой набор часто используемых команд, я решил их собрать здесь на этой страничке. Надеюсь, что они будут полезны и вам! Добавляйте страницу сразу в закладки ;)

Установка

Гайд по установке Ruby: installrails.com

Создать новый проект

rails new hello_app

Установить все зависимости

bundle install

Запустить локальный сервер

rails server

или

rails s

Далее сервер доступен по адресу: 127.0.0.1:3000

Генерация сущностей

Создать новый контроллер

rails generate controller Posts

или сокращенно

rails g controller Posts

А еще можно создать новый контроллер без тестов.

rails g controller AccountActivations --no-test-framework

Создать новую модель

rails g model Post title:string body:text

Создать новую модель с зависимостями

rails g model Comment username:string email:string body:text post:references

Не забудьте потом в родительской моделе укзать также привязку к дочерним сущностям:

class Post < ApplicationRecord
  has_many :comments
end

Добавить свойство в модель

rails g migration add_fields_to_posts body_short:text

Создать все сразу с помощью scaffold (модели, контроллеры, вьюхи)

rails generate scaffold Post title:string body:text

Scaffold сделает за вас всю основную рутинную работу. Но самому придется все равно поработать: над валидацией данных, например.

Выполнить миграцию

rake db:migrate

Обнулить базу данных

rake db:migrate:reset

Заполнить базу данных значениями для development (если у вас есть скрипт seeds.rb)

rake db:seed

Добавить интеграционный тест

rails generate integration_test site_layout

Bug-Fixing

Откатить изменения

Очень часто создашь контроллер или модель, а потом думаешь "А не добавить ли еще пару полей?". А Ruby on Rails уже сгенерировал тебе и контроллер, и вьюхи, и рутинг прописал. Да еще и тестов добавил. Так вот чтоб это все руками не удалять, есть такая замечательная команда, как destroy:

rails destroy controller Posts
rails destroy model Post

А вот этой командой можно откатить последнюю выполенную миграцию. Если команду запустить 2 раза, то откатятся 2 последнии миграции:

rake db:rollback

Запустить тесты

rake test

А вот так можно запустить только интеграционные тесты:

rake test TEST=test/integration

А ещё можно запустить один конкретный тест из какого-либо файла с кучей других тестов:

rake test TEST=test/integration/users_login_test.rb TESTOPTS="--name test_login_with_valid_information"

В Rails есть также такая штука как Guard. Guard - это гем, который мониторит изменения файлов и запускает периодически тесты сам (какие именно тесты запускать, вы можете откорректировать в файле Guardfile). Таким образом вы можете в одном из терминалов запустить Guard, и как только вы где-то напортачите, он скажет вам об этом! Ссылка на документацию и гайд по настройке: https://github.com/guard/guard.

Breakpoint с вызовом консоли

В коде в Ruby on Rails можно поставить вызов функции дебага в любом месте.

...
def show
@user = User.find(params[:id])
byebug # В этом месте откроется консоль с терминале с запущенным сервером
end
...

И в этой консоле вы можете посмотреть, например, что хранится в @user.

(byebug) @user
#<User id: 4, name: "German", email: "krutovgerman2007@ya.ru", created_at: "2020-08-20 16:47:53", updated_at: "2020-08-20 16:47:53", password_digest: [FILTERED]>

Служебное

Посмотреть, какие URLs существуют

rake routes

Отладчик: прямо внутри контроллера (к примеру, контроллера create) можно отрендерить переменные POST

def create
  render plain: params[:post].inspect
end

Добавить новый гем

Добавляем новую строку в Gemfile:

gem 'mysql2'

Запускаем команду:

bundle install

Гемы - это дополнительные готовые библитеки, которые можно просто добавить в свой проект и использовать. Например, для работы с базой данных или для общения с API FaceBook.

Конфиг для работы с MySql выглядит примерно так (config/database.yml):

default: &default
  adapter: mysql2
  host: localhost
  username: root
  password: qwer1234
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: ruby_simpleblog

test:
  <<: *default
  database: ruby_simpleblog_test

production:
  <<: *default
  database: ruby_simpleblog_production

Обновить гемы до последних сопоставимых версий

bundle update

Зайти в консоль Rails

rails console
> first_post = Post.first
> first_post.comments
> comments = first_post.comments.first
> comments.post
> exit

Консоль - это вообще крутая штука, как выяснилось. Вместо того чтобы устанавливать везде var_dump();, как это делается в PHP, можно просто зайти в консоль и поглядеть, что хранят в себе переменные.

В консоль можно также зайти в режиме "песочница". Все, что вы там наделаете, будет откачено назад как только вы закроете консоль (Ctrl + D).

rails console --sandbox

Необычный синтаксис

В Ruby есть очень много удобных и на первый взгляд необычных сокращений и методов. На примерах будет более понятно, я думаю. Кстати, вы можете зайти в консоль (rails console) и там выполнить все нижеприведенные примеры!

В масиве можно двигаться назад.

a = [1, 2, 3, 4]
a[-1] # 4
a.last # 4

Методы, которые возвращают boolean, заканчиваются на вопросительный знак.

a = [1, 2, 3, 4]
a.empty? # false
a.include?(3) # true

Восклицательный знак в конце (бэнг) означет, что результат метода надо присвоить обратно в переменную.

a = [1, 2, 3, 4]
a.stuffe! # [2, 1, 4, 3]
a = a.stuffe # [2, 3, 4, 1]
a.sort! # a равен снова [1, 2, 3, 4]

Добавить элемент в массив очень просто.

a = [1, 2, 3, 4]
a << 5 # [1, 2, 3, 4, 5]
a.push(6) # [1, 2, 3, 4, 5, 6]
a << 7 << 8 # [1, 2, 3, 4, 5, 6, 7, 8]
a.push(9, 10) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

В Ruby есть диапазоны :)

a = 0..9
a.to_a # преобразовав диапазон в массив (в array) мы получим [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = 'a'..'e'
b.to_a # ["a", "b", "c", "d", "e"]

Массив строк (а точнее массив слов) можно создать без кавычек

a = %w(I want to eat) # ["I", "want", "to", "eat"]

С помощью диапазона можно вытащить элементы массива. Ваще круто!

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a[5..7] # [6,7,8] (ну поскольку нумерация элементов в массиве начинается с нуля)

А еще есть такая головоломающая фича. Оооо, лучше не смотрите это: все равно непонятно как это работает :)

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a[2..-1] # [2, 3, 4, 5, 6, 7, 8, 9]

Вот так можно пять раз напечатать слово Hello.

5.times { puts 'Hello!'}
(1..5).each { puts 'Hello!' }

Возвести число в степерь очень просто.

a = 3**3 # 27

В Ruby, как и в PHP, есть ассоциативные массивы, называемые хэшами.

a = { 'first_name' => 'German', 'second_name' => 'Krutov'}
puts a['first_name'] # German

А еще в Ruby есть символы. Они начинаются с двоеточия. Это почти то же самое что строки, но не строки :))). Это странный тип данных, но он есть. В основном используется для ключей хэшей :)

a = { :first_name => 'German', :second_name => 'Krutov'}
puts a[:first_name] # German
puts a['first_name'] # nil Поскольку строка 'first_name' не равна символу :first_name. А nil - это аналог null в Ruby

Объявление хэша с символами в качестве ключей можно сократить.

a = { first_name: 'German', second_name: 'Krutov'} # То же самое, что и a = { :first_name => 'German', :second_name => 'Krutov'}
puts a[:second_name] # Krutov

Хэши можно сравнивать

a = { first_name: 'German', second_name: 'Krutov'}
b = { :first_name => 'German', :second_name => 'Krutov'}
a == b # true

Переменные можно встравивать в строки, которые находятся в двойных кавычках.

user_name = 'German Krutov'
puts "Hello, #{user_name}!" # Hello, German Krutov!

Метод inspect позволяет вывести переменную с буквальным представлением объекта (мы сразу поймем, что перед нами).

puts "1" # 1
puts 1   # 1
puts 'a' # a
puts :a  # a

# А теперь с inspect
puts "1".inspect # "1"
puts 1.inspect   #  1
puts 'a'.inspect # "a"
puts :a.inspect  # :a

# И тот же самый inspect, но сокращенная запись
p "1" # "1"
p 1   #  1
p 'a' # "a"
p :a  # :a

Функции можно вызывать без скобок.

def test(a)
  puts a.to_s
end

# Можно вызвать так
test('Hello')

# Можно вызвать и так
test 'Hello'

В Rails у моделей есть прикольное свойство toogle. Представьте что у вас есть двери, у которых есть состояние "open" (true или false). К примеру, вот так мы можем захлопнуть или открыть дверь.

door_one = Door.find(1)
door.toogle!(:open)

Конец

Ребята, по мере изучения Ruby on Rails я буду добавлять сюда часто используемые команды. Очень рад, если эта шпаргалка уже кому-то пригодилась!