Шпаргалка по 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 я буду добавлять сюда часто используемые команды. Очень рад, если эта шпаргалка уже кому-то пригодилась!