Содержание
Зачем.
В этой маленькой статье, которую с удовольствием прочитал бы сам неделю назад, я попытался собрать все вещи, которые понадобились бы человеку, задумай он «с нуля» написать приложение на RoR. То есть не углубляясь ни в одну из областей, описать необходимый минимум действий, чтобы установить, настроить и написать своё первое приложение.Здесь собрано, как мне кажется, всё, что нужно и я надеюсь этот текст сэкономит кому-нибудь несколько часов поиска в интернете). Сам изучаю RoR вторую неделю, так что не судите строго).
Установка.
Просто и быстро ror ставится через rvm c rvm.io/.
>\curl -L https://get.rvm.io | bash -s stable --rails --autolibs=enabled
Запустить rvm:
>source /Путь_к_домашней_директории*/.rvm/scripts/rvm
*$HOME в дальнейшем.
После этого в $HOME/.bash_profile должна появиться строчка:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
и при каждом открытии консоли rvm будет подгружаться, но у меня этого не случилось — пришлось ещё в $HOME/bashrc прописывать:
. ~/.bash_profile
Теперь всё точно должно быть хорошо.
Устанавливаем нужную(скорее всего это будет самая последняя) версию руби (сколько их и в чём отличие можно посмотреть сдесь -http://www.ruby-lang.org).
>rvm install 1.9.3
Проверка на успешность создания
>ruby -v
должна вернуть более подробную информацию, вроде
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-linux].
В процессе установки я случайно установил несколько версий, что потом доставило некоторые неприятности). Посмотреть список установленных версий руби можно так:
>rvm list
Если версий несколько, то текущая будет помечена «=>», дефолтная — «*», а текущая и дефолтная — «=*». Поменять на нужную используемую версию можно так:
>rvm use ruby-1.9.2-p320 (любая нужная версия)
Чтобы поменять дефолтную версию руби пишем:
>rvm use ruby-1.9.2-p320 --default
Создание проекта.
Теперь можно перейти непосредственно к созданию проекта. Создаём папку $HOME/ROR/tickets, заходим в неё и делаем следующее.
>sudo gem install bundler
>rails new tickets
При создании проекта будут сгенерированы все необходимые директории(app,config,db,log и т.п.) и конфигурационные файлы в указанной папке. Для работы небольшого тестового проекта нам потребуется, в моём случае, база данных PostgreSQL, пара gem-ов(библиотек) и запущенный rails сервер).
Для запуска сервера нужно, находясь в корне папки с созданным проектом запустить команду:
>rails s -p 3000
где s — команда запуска сервера, а -p 3000 -номер порта, по которому будет доступен проект. Что бы запустить консоль, нужно набрать:
>rails c
Список всех команд можно посмотреть, набрав
>rails —h. Теперь по адресу localhost:3000 мы увидем стартовую страницу проекта. Так же можно запускать любое количество серверов других проектов на других, не занятых портах. В ходе работы. у меня в один момент по какой-то неведомой мне причине возникла проблема с запуском сервера — выдавалась ошибка, что сервер уже запущен — для её решения нужно просто удалить файл $HOME/ROR/tickets/config/tmp/pids/server.pid и запустить сервер ещё раз.
База данных.
Чтобы работать с постгресом, добавляем в конец файла Gemfile, который должен находится в корне проекта, строчку
>gem ‘pg’
сохраняем файл и делаем
>bundle install
его мы делаем каждый раз, когда вносим изменения в Gemfile, а потом ещё и перезапускаем сервер. Чтобы сюда больше не возвращаться, сразу же добавляем и
>gem ‘haml-rails’ для быстрой и удобной(после того как привыкнешь)) разметки шаблонов-представлений. Теперь отредактируем атрибуты конекта к постгресу в файле database.yml. Он находится в папке $HOME/ROR/tickets/config/ и должен будет содержать такой блок:
development:
host: localhost
adapter: postgresql
encoding: unicode
database: tickets
pool: 5
username: tickets
с нужными пользователем и именем БД, у меня это tickets и tickets соответственно).
Вроде бы все приготовления закончены и можно приступать к созданию модели, контроллера и представления.
Модель.
Создаём модель:
>rails g model user
Название модели пишем в единственном числе — таблица в бд будет во множественном. Эта команда создаст файлы модели и миграции в $HOME/ROR/tickets/app/models/user.rb и $HOME/ROR/tickets/app/db/migrate/20130425081208_create_users.rb. все файлы контроллеров и моделей имеют расширение .rb, представлений — .html.haml(в нашем случае использования haml). Посредством миграции мы будем управлять работой с таблицами в БД через консоль, что весьма удобно(опять таки, когда привыкаешь), так же ониобеспечивают простоту переноса приложения, на другой сервер, например. Добавляем нужные поля:
class CreateUsers < ActiveRecord::Migration
def up
create_table :users do |t|
t.string :name, null: false
t.boolean :role, null: false, default: false
t.datetime :reg_date
t.timestamps
end
end
def down
drop_table :users
end
end
Создаём два метода — up и down, которые используются по умолчанию функциями работы с миграциями — они, соответственно, создают и удаляют нашу таблицу. Названия типы данных будут зависеть от используемой БД. Первичный ключ создаётся по умолчанию и будет называться id, но его можно задать и явно:
create_table :users, :primary_key => :users_id do |t|
А если мы не хотим создавать первмчный ключ вообще, пишем так:
create_table :users, :id => false do |t|
Сохраняем и пишем в консоле:
>rake db:migrate
В результате действия этой команды выполняются все невыполненные методы up из файлов миграций в директории $HOME/ROR/tickets/app/db/migrate/. Все сведения о состоянии таблиц можно посмотреть в файле $HOME/ROR/tickets/app/db/shema.rb.
>rake db:rollback
Запускает метод down последней выполненной миграции, в результате чего таблица удаляется из БД. Чтобы откатить больше миграций, нужно добавить к команде rollback параметр STEP:
>rake db:rollback STEP=3
эта команда откатит три последние миграции. Посмотреть статус всех миграций в консоли:
>rake db:migrate:status
Если нужно запустить какой-то определённый метод из определённой миграции, то добавляем параметр VERSION:
>rake db:migrate:up VERSION=000001
В файле модели ($HOME/ROR/tickets/app/models/user.rb) нам пока нужно сделать только одно — определить поля таблицы, которые будут доступны для изменения из контроллера, в целях безопасности, как я понимаю). Для этого пишем в нём следующее:
class User < ActiveRecord::Base
attr_accessible :name, :role
end
Кстати, синтаксис языка очень чувствителен к табуляциям — их очень хорошо можно отслеживать в редакторе, которым пользуюсь я — sublime_text.
Пока приложение не работает, для того, чтобы удостовериться, что все созданные таблицы действительно созданы и функционируют как им и положено, можно воспользоваться раилс консолью:
>user = User.new(name:"Test",role:"true")
эта команда не сделает запись в таблицу, но создаст объект руюи в памяти со всеми установленными атрибутами. А теперь сделаем запись:
>user.save
в случае успеха должна вернуть true. Запись можно создать и рдной командой — create:
>User.create(name:"Test",role:"true")
Чтобы проверить есть ли объект в БД, можно использовать find:
>User.find(1)
вернёт объект или ошибку: «ActiveRecord::RecordNotFound: Couldn’t find User with id=1», а так же и сам сгенерированный sql-запрос к БД.
Искать можно и по конкретным полям:
>User.find_by_name("Test")
Ещё несколько удобных методов, которые наверняка пригодятся на первых порах:
>User.first и User.last -вернут первую и последнюю запись в таблице соответственно, а User.all вернёт массив всех объектов таблицы.
Контроллер.
Создаём контроллер:
>rails g controller users
В результате этой команды будут созданы файл контроллера: $HOME/ROR/tickets/app/controllers/users_controller.rb и директория для представлений:
$HOME/ROR/tickets/app/views/users/. Каждому методу котроллера будет соответствовать представление с таким же названием, в этой папке. Их можно создавать вручную, а можно и сразу при создании контроллера:
>rails g controller users index,list
В этом случае файлы представлений создадутся автоматически в папке $HOME/ROR/tickets/app/views/users/ и будут называться (если вы не забыли подключить haml) index.html.haml и list.html.haml. Удалить контроллер можно так:
>rails d controller users
Определять метод index, который создаётся по умолчанию, не обязательно. Содержимое нашего контроллера users будет таким:
class UsersController < ApplicationController
def list
@users_list=User.all
end
end
В users_list будет массив объектов пользователей, которых мы по идее уже понадобавляли из консоли, а «@» означает, что переменная будет передана в шаблон.
Представление.
Теперь создаёи представление, я просто создал этот файл руками в нужной директории:
$HOME/ROR/tickets/app/views/users/list.html.haml
Документацию по HAML можно почитать здесь, а пока набо понадобится минимум знаний о нём, например то, что вместо открывающего и закрывающего тега в нём используется «%tag». То есть после рендеринга шаблона, содержащего %html, мы получим страницу с
<html></html>
. Уровень вложенности задаётся табуляцией, атрибуты тегов пишутся «хешеобразно» в фигурных скобках:
%td{colspan=>"2"}
превратится в
<td colspan="2"></td>
, а содержимое — через пробел: %td test. Таким образом содержимое нашего представления:
%table{:border=>"1"}
%tr
%td Логин
%td Администратор
- @users_list.each do |users|
%tr
%td= users.name
%td
%input{:type=>"checkbox",:name=>"role_#{users.id}",:checked=>users.role}
%br
Дефис — исполняемый код в шаблоне. Здесь мы проходимся по массиву объектов и выводим в цикле его методы — поля name и role и id.
Все представления «оборачиваются» в главный шаблон, который находится в $HOME/ROR/tickets/app/views/layouts/application.html.haml
Удаляем всё, что в нём есть и делаем его максимально простым:
!!!
%html{:lang => "en"}
%head
%title Test
%body
=yield
Содержимое всех наших сгенерированных шаблонов подставляется вместо =yield. Главное не ошибится с уровнями вложенности, меня это поначалу очень напрягало).
Маршруты.
И остался только один маленький шаг — редактирование файла-конфига маршрутов(url) — routes.rb. Он находится в $HOME/ROR/tickets/config/. В нём описываются все маршруты нашего проекта. Сейчас там будет только две записи:
Tickets::Application.routes.draw do
root :to => "users#index"
#GET Urls
get "users/list"
end
Это рутовый путь на «главную» страницу(будет показываться содержимое шаблона /users/index.html.haml, даже несмотря на то, что метод index в контроллере не определён) и путь к странице вывода списка пользователей. В случае, если к методу будет пост запрос, он должен будет прописываться так:
post «users/add».
Теперь всё должно работать)