Ruby on Rails. Установка, настройка, начало работы

Содержание

Зачем.

В этой маленькой статье, которую с удовольствием прочитал бы сам неделю назад, я попытался собрать все вещи, которые понадобились бы человеку, задумай он «с нуля» написать приложение на 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».
Теперь всё должно работать)