Ruby on Rails. Установка, настройка, начало работы
В этой маленькой статье, которую с удовольствием прочитал бы сам неделю назад, я попытался собрать все вещи, которые понадобились бы человеку, задумай он «с нуля» написать приложение на RoR. То есть не углубляясь ни в одну из областей, описать необходимый минимум действий, чтобы установить, настроить и написать своё первое приложение.Здесь собрано, как мне кажется, всё, что нужно и я надеюсь этот текст сэкономит кому-нибудь несколько часов поиска в интернете). Сам изучаю RoR вторую неделю, так что не судите строго).
Установка.Просто и быстро ror ставится через rvm c rvm.io.
*$HOME в дальнейшем. После этого в $HOME/.bash_profile должна появиться строчка:
и при каждом открытии консоли rvm будет подгружаться, но у меня этого не случилось — пришлось ещё в $HOME/bashrc прописывать:
Теперь всё точно должно быть хорошо. Устанавливаем нужную(скорее всего это будет самая последняя) версию руби (сколько их и в чём отличие можно посмотреть здесь -http://www.ruby-lang.org).
Проверка на успешность создания
должна вернуть более подробную информацию, вроде
В процессе установки я случайно установил несколько версий, что потом доставило некоторые неприятности). Посмотреть список установленных версий руби можно так: >rvm list Если версий несколько, то текущая будет помечена "=>", дефолтная — "*", а текущая и дефолтная — "=*". Поменять на нужную используемую версию можно так:
Чтобы поменять дефолтную версию руби пишем:
Создание проекта.Теперь можно перейти непосредственно к созданию проекта. Создаём папку $HOME/ROR/tickets, заходим в неё и делаем следующее.
При создании проекта будут сгенерированы все необходимые директории(app,config,db,log и т.п.) и конфигурационные файлы в указанной папке. Для работы небольшого тестового проекта нам потребуется, в моём случае, база данных PostgreSQL, пара gem-ов(библиотек) и запущенный rails сервер). Для запуска сервера нужно, находясь в корне папки с созданным проектом запустить команду:
где s — команда запуска сервера(server), а -p 3000 -номер порта(port), по которому будет доступен проект. Что бы запустить консоль, нужно набрать:
где с- сокращение от console Список всех команд можно посмотреть, набрав >rails --h. Теперь по адресу localhost:3000 мы увидем стартовую страницу проекта. Так же можно запускать любое количество серверов других проектов на других, не занятых портах. В ходе работы. у меня в один момент по какой-то неведомой мне причине возникла проблема с запуском сервера — выдавалась ошибка, что сервер уже запущен — для её решения нужно просто удалить файл $HOME/ROR/tickets/config/tmp/pids/server.pid и запустить сервер ещё раз.
База данных.Чтобы работать с постгресом, добавляем в конец файла Gemfile, который должен находится в корне проекта, строчку >gem 'pg' сохраняем файл и делаем
его мы делаем каждый раз, когда вносим изменения в Gemfile, а потом ещё и перезапускаем сервер. Чтобы сюда больше не возвращаться, сразу же добавляем и >gem 'haml-rails' для быстрой и удобной(после того как привыкнешь)) разметки шаблонов-представлений. Теперь отредактируем атрибуты конекта к постгресу в файле database.yml. Он находится в папке $HOME/ROR/tickets/config/ и должен будет содержать такой блок:
с нужными пользователем и именем БД, у меня это tickets и tickets соответственно).
Вроде бы все приготовления закончены и можно приступать к созданию модели, контроллера и представления.
Модель.где g- сокращение от generate Название модели пишем в единственном числе — таблица в бд будет во множественном. Эта команда создаст файлы модели и миграции в $HOME/ROR/tickets/app/models/user.rb и $HOME/ROR/tickets/app/db/migrate/20130425081208_create_users.rb. все файлы контроллеров и моделей имеют расширение .rb, представлений — .html.haml(в нашем случае использования haml). Посредством миграции мы будем управлять работой с таблицами в БД через консоль, что весьма удобно(опять таки, когда привыкаешь), так же ониобеспечивают простоту переноса приложения, на другой сервер, например. Добавляем нужные поля:
Создаём два метода — up и down, которые используются по умолчанию функциями работы с миграциями — они, соответственно, создают и удаляют нашу таблицу. Названия типы данных будут зависеть от используемой БД. Первичный ключ создаётся по умолчанию и будет называться id, но его можно задать и явно:
А если мы не хотим создавать первмчный ключ вообще, пишем так:
Сохраняем и пишем в консоле:
В результате действия этой команды выполняются все невыполненные методы up из файлов миграций в директории $HOME/ROR/tickets/app/db/migrate/. Все сведения о состоянии таблиц можно посмотреть в файле $HOME/ROR/tickets/app/db/shema.rb.
Запускает метод down последней выполненной миграции, в результате чего таблица удаляется из БД. Чтобы откатить больше миграций, нужно добавить к команде rollback параметр STEP:
эта команда откатит три последние миграции. Посмотреть статус всех миграций в консоли:
Если нужно запустить какой-то определённый метод из определённой миграции, то добавляем параметр VERSION:
В файле модели ($HOME/ROR/tickets/app/models/user.rb) нам пока нужно сделать только одно — определить поля таблицы, которые будут доступны для изменения из контроллера, в целях безопасности, как я понимаю). Для этого пишем в нём следующее:
Кстати, синтаксис haml очень чувствителен к табуляциям — их очень хорошо можно отслеживать в редакторе, которым пользуюсь я — Sublime Text.
Пока приложение не работает, для того, чтобы удостовериться, что все созданные таблицы действительно созданы и функционируют как им и положено, можно воспользоваться раилс консолью:
эта команда не сделает запись в таблицу, но создаст объект руюи в памяти со всеми установленными атрибутами. А теперь сделаем запись:
в случае успеха должна вернуть true. Запись можно создать и одной командой — create:
Чтобы проверить есть ли объект в БД, можно использовать find:
вернёт объект или ошибку: «ActiveRecord::RecordNotFound: Couldn't find User with а так же и сам сгенерированный sql-запрос к БД. Искать можно и по конкретным полям:
Ещё несколько удобных методов, которые наверняка пригодятся на первых порах: >User.first и User.last -вернут первую и последнюю запись в таблице соответственно, а User.all вернёт массив всех объектов таблицы.
Контроллер.В результате этой команды будут созданы файл контроллера: $HOME/ROR/tickets/app/controllers/users_controller.rb и директория для представлений: $HOME/ROR/tickets/app/views/users/. Каждому методу котроллера будет соответствовать представление с таким же названием, в этой папке. Их можно создавать вручную, а можно и сразу при создании контроллера:
В этом случае файлы представлений создадутся автоматически в папке $HOME/ROR/tickets/app/views/users/ и будут называться (если вы не забыли подключить haml) index.html.haml и list.html.haml. Удалить контроллер можно так:
где d- сокращение от destroy Определять метод index, который создаётся по умолчанию, не обязательно. Содержимое нашего контроллера users будет таким:
В users_list будет массив объектов пользователей, которых мы по идее уже понадобавляли из консоли, а "@" означает, что переменная будет передана в шаблон.
Представление.Теперь создаёи представление, я просто создал этот файл руками в нужной директории: $HOME/ROR/tickets/app/views/users/list.html.haml Документацию по HAML можно почитать здесь (http://haml.info/tutorial.html), а пока набо понадобится минимум знаний о нём, например то, что вместо открывающего и закрывающего тега в нём используется "%tag". То есть после рендеринга шаблона, содержащего %html, мы получим страницу с . Уровень вложенности задаётся табуляцией, атрибуты тегов пишутся «хешеобразно» в фигурных скобках: превратится в , а содержимое — через пробел: %td test. Таким образом содержимое нашего представления:
Дефис — исполняемый код в шаблоне. Здесь мы проходимся по массиву объектов и выводим в цикле его методы — поля name и role и id.
Все представления «оборачиваются» в главный шаблон, который находится в $HOME/ROR/tickets/app/views/layouts/application.html.haml Удаляем всё, что в нём есть и делаем его максимально простым:
Содержимое всех наших сгенерированных шаблонов подставляется вместо =yield. Главное не ошибится с уровнями вложенности, меня это поначалу очень напрягало).