2 March 2010

First slice of rails

Ruby on Rails
-О чём вы, Морфеус?

Количество фреймворков в мире растёт с пугающей скоростью. Тысячи их уже на данный момент. Благо, лучших из низ — не так много. Весь мир Web разработчиков просто подразделился на несколько групп, которые отадют предпочтение тому или иному фреймворку. Я не люблю тёрок и холиваров, так что бог с ним с тем, что лучше. Я лишь хочу поговорить с разработчиками ASP.NET о Ruby on Rails.

Зачем?

Расскажу свою историю. На ASP.NET я пишу с 2004 года. Знаю множество закоулков данной системы и знаю, что она сама по себе восхитительна. Я пережил 3 больших проекта на .NET и написал с 10 сайтов, которые сейчас продолжают стабильно работать. Если говорить о фрейворкнутости, то .NET меня удовлетворял всем. В самых больших проектах я находил решения самых сложных задач. И вот, через 6 лет мне просто захотелось посмотреть, а что же есть другого на рынке? Естественно, первым делом я наткнулся на RoR.


Статья рассчитана на опытных программистов. Если вы не можете отличить компилятор от интерпретатора, то вам лучше в гугл.


Что же меня заинтересовало? Я посмотрел вот этот скринкаст. В нём бойко рассказывается о том, как за 15 минут можно создать блог, используя RoR. Ладно, решил я, коли говорите, что всё так радостно, то стоит попробовать.
Лирическое отступление. Для того, чтобы хозяева Windows могли посмотреть mov файл без установки QuickTime им придётся обзавестись альтернативной версией Quick Time и поставить себе Media Player Classic. Большинство скринкастов по руби сделаны на Мак ОС. Я сам — прожжёный виндузятник, и мне пришлось немного повозиться. Опять же, это не статья о холиварах.

Вернёмся к теме.

Поговорим о терминологии и о том, что нам понадобится

Ruby — интерпретируемый язык высокого уровня для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Лисп, Dylan.

Любой програмист, который занимался разработкой на .NET в течении года, в состоянии понять и быстро изучить Ruby. Да и статей на эту тему написано не мало. Останавливаться не будем.

Поставить Руби на Windows можно использовав One-Click Install

Замечу, что в отличии от привычной директории %APPDATA% всё что касается Руби лучше ставить на диск C: или что-то типа того. Просто это облегчит в дальнейшем работу с системой.

Сразу скажу, что Ruby без плагинов — он как рубин неогранённый. Поэтому, был разработан Gems.
RubyGems — менеджер пакетов для языка программирования Руби который предоставляет стандартный формат для программ и библиотек Руби (в самодостаточном формате «gems»), инструменты предназначеные для простого управления установкой «gems», и сервер для их распространения.

На самом деле, я не могу найти в .NET хоть сколько-нибудь подобной замены нормальному менеджеру пакетов. Концепция .NET такова, что каждый делает инсталлятор и распространяет пакеты для .NET в угодной ему форме. В Ruby всё намного проще и лучше. Например, существует сайт facebook.com, который набирает популярность в России. Для facebook.com написан API, который можно использовать в своих программах. Кто-то уже написал оболочку для этого API. Отлично! Вот ею мы и можем воспользоваться, набрав в PowerShell седующую команду:
gem install facebooker

По поводу того, что значит набрать команду gem install facebooker. Просто меня, как для заядлого виндузятника, это всегда приводило в ступор. Ибо надо было искать исполняемый файл gems. Всё что Вам надо находится в папке C:\Ruby\bin

Сразу же порекомендую обновить этот Gems до самой свежей версии, ибо в дальнейшем это очень пригодится.
    PS C:\Ruby\bin> gem update --system


Ещё чуть чуть терминов, и можно начинать программировать.

Ruby on Rails — программный каркас, написанный на языке программирования Ruby. Ruby on Rails предоставляет архитектурный образец Model-View-Controller (модель-представление-контроллер) для веб-приложений, а также обеспечивает их интеграцию с веб-сервером и сервером базы данных.
Предоставляет однородную среду для разработки динамических AJAX-интерфейсов, с обработкой запросов и выдачи данных в контроллерах, отражения предметной области в базе данных.
Ruby on Rails является открытым программным обеспечением и распространяется под лицензией MIT.

А вот и наш герой! Собственно говоря, если вы всё ещё не поняли, чем Ruby on Rails отличается от Ruby — позвольте предложить Вам следующее уравнение, которое поможет во всём разобраться.
dotNET => 'ASP.NET Framework'
Ruby => 'Ruby on Rails'

Думаю, так будет попонятнее. И так, у нас есть язык, у нас есть фреймворк, который позволяет работать на этом языке, создавая WEB приложения. Ещё чуть чуть и можно начинать.
Ибо, после того, как мы поставили и настроили фреймворк, нам надо только запустить сервер, и проверить то, как он работает. Тут я могу начать рассказывать о том, как надо ставить на систему Apache, sqlLite или MySQL… Но это слишком долго и муторно. Тут есть два варианта облегчения жизни:
1) Instant Rails — это уже настроенный для работы сервер, который включает в себя Апач, Сиквел и Руби с Рельсами. Распаковываете архив на диск, запускаете батник, он пару раз материться и конфигурирует апач и всё, что душе угодно. Плюс в том, что установка всего этого счастья предельно проста. Даже ДенWER по сравнению с этой радостью покажется жутко замороченным. Замечу, что этот вариант идеально подходит для тех разработчиков, которые лучшей средой разработки считают Notepad++.

2) Aptana — вот это понадобится тем, кто не может жить без Visual Studio или Sharp Develop. Это — уже полноценная студия, которая позволяет писать на RoR и существенно облегчает жизнь программиста.

Предупреждаю: студию надо будет ставить в папку, которая не содержит русских символов в именах директорий. Ибо некоторые части фреймворка не понимают, что значит русский. Рекомендую ставить как можно ближе к диску.

Студия сама предложит поставить Руби, если раньше вы этого не сделали. Так же, Аптана заметит, что для деббага яваскрипта вам потребуется Firefox 1.5 и выше.

Всё на Ваш выбор. Я буду работать с Аптаной, так как она сделала жизнь проще. Сразу говорю, что перед началом работы Вам надо будет обновить Gems, как написано выше.

Для счастливых обладателей Windows 7 — Aptana работает стабильно только под Админскими правами. Чего и Вам рекомендую.

Ну вот, кажется всё рассказал, можно начинать проект.



В Аптане это всё делается правым кликом мышки в окне Rails Explorer. Ещё раз замечу, что весь проект лучше размещать как можно ближе к корню диска и в папках без русских символов.

Если вы матёрый программер, то вы можете повозиться с рельсами и проложить их себе через консоль, а не через правую кнопку мыши.
PS C:\Ruby\bin> rails testblog

Собственно говоря, по сути своей команды абсолютно одинаковы. Обе они создадут каркас сайта, который Вы будете писать. Разница в том, что Аптана ещё и запустит сервер под это дело. Кстати, если она этого не сделает, то вы можете ещё поправить, нажав Window>Show view>Servers

Ну вот, теперь по адресу http://localhost:3000/ у нас располагается абсолютно ненужная страница, которая с радостью говорит о том, что у нас всё неплохо работает. Хотя, на самом деле, на этой странице висит туториал о том, как правильно сделать свою первую БД и доступ к ней. Давайте последуем ему, я просто добавлю кое-какие данные, чтобы Вы вообще не запутались.

И так, вот мы создаём новый проект:


И вот, мы его создали:


Сразу хочу обратить Ваше внимание на пару фактов. Во первых, если вы действительно всегда писали только под .NET и никогда не видели Апач, то знайте, что корень любого сайта — это папка public. Отмечена синим цветом. Рейлз щедро одарил эту папку различными заглушками страниц ошибок, индексными страницами и так далее. Что же, это очень даже удобно.

Просто для будущих поколений отмечу, что в Руби большое внимание уделено системе автоматического тестирования. Фиолетовым цветом отмечена папка test. Просто знайте, что тестирование Ваших приложений — это действительно важно, и помните, что Руби позволяет хорошо автоматизировать эту рутину.

Красным цветом отмечена основная радость Рельс. Это папка Арр, которая содержит в себе 3 наиважнейших папки — controllers, models и views.
Собственно говоря, MVC — суть всех Рельс. Ведь приложение строится именно на них. Давайте построим небольшой кусочек этого приложения.

Если вы не найдёте у себя такой вкладки — нажимайте Window > Show View > Genarators


Теперь мы последуем примеру со страницы http://localhost:3000/ и сгенерируем скаффолд recipe title:string author:string description:text

Тааак. Мне кажется вот тут вот смысл начинает теряться. Что такое скаффолд? Вот, как раз с этим и надо разобраться! На мой взгляд скаффолд — это одна из самых больших вкусностей Rails. За свою жизнь я повидал много средств для доступа к данным. Я написал два самопальных фреймворка, которые позволяли управлять данными. Я использовал ASP.NET Entity Framework, но… Скаффолд поразил меня своей простотой и мощностью. Давайте по порядку.

scaffold — эшафот; плаха; виселица; казнь
to go to / mount the scaffold — сложить голову на плахе; окончить жизнь на виселице
to bring to the scaffold — довести до виселицы
to send to the scaffold — приговорить к смерти


И тут не без приколов. Не знаю, о чём думали разработчики, но перевод этого слова меня настораживает.

scaffold — обстраивать лесами
The house was scaffolded to the very attics. — Леса были выстроены до самого чердака дома.
2) поддерживать, подпирать, нести (на себе) нагрузку
3) помещать (продукты) на высокие подмостки (для сушки, защиты от животных)

Вот так то лучше. Скаффолд — это нечто, что несёт на себе нагрузку. В данном случае скаффолд — это то, что берёт на себя функции доступа к БД и полностью лишает программиста всего мозгоё мучения.

Что же за команду мы набрали?
Сущность: recipe
Поле: тип
title:string
author:string
description:text

И так, мы создали новую сущность в слое доступа к данным.
В папке db была создана папка migrate, в которой появился скрипт, позволяющий мигрировать нашу сущность на конечную БД.

class CreateRecipes < ActiveRecord::Migration
  def self.up
    create_table :recipes do |t|
      t.string :title
      t.string :author
      t.text :description

      t.timestamps
    end
  end

  def self.down
    drop_table :recipes
  end
end


Этот класс был автоматически создан фреймворком, и имеет два метода. Up и Down. Эти методы будут использоваться для наката на базу, и отката с базы. То есть, если вы несколько раз вносите правки в ваш скаффолд, то создастся несколько версий скрипта миграций, которые последовательно будут вызывать метод Up. Это позволяет Вам держать вашу БД под контролем и нормально накатывать её на продакшин сервера.

Более того, прошу заметить, что это нифига не SQL. Это значит, что на данный момент мы абсолютно БД-независимы.
Прошу, открывайте config/database.yaml и смотрите в его содержимое.
# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000


Правда приятно? Можно даже делать разные типы баз данных на разных серверах.

Ладно. У нас есть сущность, у нас есть описание БД, но пока у нас нету самой структуры БД для этой сущности. Поэтому мы жмём правой кнопкой по проекту, выбираем Rake > db > migrate

Ещё немного теории. Что такое Rake?
Rake — инструмент для автоматизации сборки программного кода. Он подобен SCons, Make и Apache Ant, но имеет несколько отличий. Этот инструмент написан на языке программирования Ruby и т. н. Rakefiles (аналоги Makefiles в утилите make) используют синтакс Ruby. Автором Rake является Jim Weirich.
Rake использует блоки анонимных функций Ruby для определения различных задач, используя синтакс Ruby. В нем есть библиотека основных заданий, таких как, функции для задач манипулирования файлами и библиотека для удаления скомпилированных файлов (задача «очистки»). Как и Make, Rake может также синтезировать задачи, основываясь на шаблонах (например, автоматическая сборка задачи компилирования файла на основе шаблонов имен файлов).


И так, то, что мы сделали — мы заставили rake мигрировать наши сферические сущности в вакууме на базу данных. Это очень приятно с его стороны. Осталось только написать код доступа к этой сущности и всё, можно радоваться жизни.

Но вот тут вот и лежит основной прикол Rails. Scaffold — не дурак. И не только предоставил нам код доступа к сущности, но и уже написал MVC для него. Мы можем смело заходить на localhost:3001/recipes и смотреть, что там у нас есть. А есть у нас стандартный вид доступа к БД, который позволяет вносить основные изменения и работать с БД. Можете поиграться.

Что же произошло? Где код и как это работает? Всё на месте!
Заходите в папку App и смотрите, что лежит в models, controllers и views вашего проекта. У вас уже появилось все необходимое для работы с сущностью. Хочу заметить, что в Рельсах очень многое завязано на имена переменных и файлов. Так что, изучая recipes_controller.rb вы найдёте очень много простого кода, который изначально не связан с views, но в комментариях указано, к каким именно файлам будет обращаться фреймворк.

Ну, вот теперь настало время отдать программисту в его шаловливые ручки весь код, и дать побаловаться.

После всех данных, которые я изложил, вы можете пересмотреть видеофайл, который я привёл в пример в начале статьи. Он окажется намного более понятным.

Для дальнейшего изучения я рекомендую:
Восхитительная шестичасовая лекция в Беркли. (Часть первая)

Сборник более двух сотен скринкастов по Руби: http://railscasts.com/

Для намного более глубокого понимания того, что я изложил выше, рекомендую эту статью guides.rails.info

Спасибо википедии за предоставленные цитаты.
Вам спасибо за внимание. Надеюсь, эта статья даст Вам возможность попробовать на вкус восхитительный RoR.

Эта статья сделана специально для Хабра и только для Хабра.
Tags:rorweb-разработка
Hubs: Ruby on Rails
+52
2.8k 64
Comments 64
Top of the last 24 hours