Pull to refresh

Первое знакомство с Ruby on Rails

Reading time 7 min
Views 13K
Ruby on Rails (в дальнейшем просто рельсы) это веб фреймворк, написанный на языке Ruby.
На хабре есть несколько статей о языке, думаю их будет полезно почитать, если возникнут затруднения – читайте википедию, лучшую книгу о языке – Programming Ruby, лучшую книгу о рельсах – Agile Development with Rails, и задавайте вопросы.

Начнем знакомство с установки Ruby и Rails.



Пользователям Windows нужно скачать и установить One-click Ruby installer.

Пользователям Linux (Ubuntu) установить Ruby еще проще:

<code class='sh' lang='sh'>$>sudo apt-get install ruby rubygems rake</code>


Убедимся что Ruby работает

<code class='sh' lang='sh'>$>ruby -v
ruby 1.8.5 (2006-08-25) [i486-linux]</code>


и поставим рельсы:

<code class='sh' lang='sh'>$>gem install rails --include-dependencies
$>rails -v
Rails 1.2.3</code>


Все что вам нужно для начала это текствый редактор с подсветкой синтаксиса Ruby и умение выполнять команды из консоли.
Для любителей IDE могу посоветовать Aptana, я пишу код в ней (мне просто нравится Eclipse :).
Все примеры я буду приводить для консоли, что делать в Aptana должно быть понятно, я могу написать об этом отдельно.

Теперь все готово чтобы начать новый проект.



Проект на рельсах начинается с создания скелета проекта:

<code class='sh' lang='sh'>$>rails ~/projects/example</code>


будет создана папка example и скелет проекта в ней (не забудьте заменить путь на свой). Посмотрим что внутри.

  • app – здесь будет код приложения: модели, вьюшки и контроллеры
  • components – это наследие старых версий, сейчас компоненты не используются
  • config – конфигурация приложения: прежде всего нас будут интересовать
  • параметры соединения с БД и маршрутизация URL на методы контроллеров
  • db – конфигурация создаваемых в БД таблиц будет храниться здесь
  • doc – документация, генерируется из комментариев в коде
  • lib – здесь можно разместить код полезных библиотек
  • log – логи веб сервера
  • public – корневая папка веб сервера, здесь лежит статический контент
  • script – очень полезные для разработки скрипты
  • test — тесты
  • tmp – здесь по умолчанию хранятся сессии пользователей и pid файлы
  • vendor – здесь будут плагины, которые мы будем использовать


Самое время запустить веб-сервер и убедиться что приложение работает. Идем в папку с приложением и запускаем веб-сервер, поставляемый с рельсами:

<code class='sh' lang='sh'>$>ruby script/server
ruby в начале строки нужно писать только в Windows.</code>


http://localhost:3000/

Открываем эту линку в своем любимом браузере и наблюдаем страничку «Welcome aboard» – значит все хорошо и пришло время написать простенькое приложение.

Какое приложение стоит написать?



Дело в том, что я умею писать текст с человеческой разметкой (Wiki, Markdown, Textile), но хабр поддерживает только html для разметки текста, а мне не удобно писать html когда я хочу просто написать текст.
Поэтому приложение будет форматировать текст в html!

Изначально оно будет очень простым, потребуется всего две странички: на первой можно будет ввести текст, а на второй посмотреть его в отформатированном виде и скопировать получившийся html (чтобы запостить на хабр :).

Начинаем писать код.



Для ленивых я выложил исходный код приложения, но все же писать код самому интереснее.

Думаю ни для кого не секрет что паттерн MVC стал де-факто стандартом архитектуры веб приложений. Рельсы не исключение, приложение состоит из моделей, вьюшек и контроллеров.

Сейчас и в будущем мы будем использовать скрипты которые сделают за нас всю рутинную работу, первый с которым мы познакомимся это generate, он генерирует код.

<code class='sh' lang='sh'>Создадим контроллер (я назвал его formatting_controller) с двумя методами (вьюшками):
input – для ввода текста  
preview – для просмотра форматированного текста

$>ruby script/generate controller formatting input preview</code>


В результате рельсы сгенерировали несколько файлов из которых сейчас интересны следующие:

<code class='sh' lang='sh'>app/controllers/formatting_controller.rb
app/views/formatting/input.rhtml
app/views/formatting/preview.rhtml</code>


Как же увидеть сгенерированные страницы в браузере?

http://localhost:3000/formatting/input

http://localhost:3000/formatting/preview

Почему такие урлы?



За внешний вид урлов в рельсах отвечает модуль Routing, настроить его можно в файле

<code class='sh' lang='sh'>config/routes.rb</code>


Сейчас я не буду вдаваться в детали роутинга, об этом можно написать отдельную статью. Сейчас просто добавьте эти две строчки и я обьясню их назначение.

<code class='ruby' lang='ruby'>map.connect '', :controller => 'formatting', :action => 'input', :conditions => { :method => :get }
map.preview '', :controller => 'formatting', :action => 'preview', :conditions => { :method => :post }</code>


connect и preview это вызовы методов. Первый аргумент это путь, в нашем случае путь пустой, тоесть это правила для корня сайта. Второй аргумент это хеш, который содержит какой метод у какого контроллера нужно вызвать и при каких условиях. Тоесть если приходит HTTP GET для корня сайта, то будет вызван метод input, а если HTTP POST, то preview.

Чем вызов connect отличается от вызова preview?
Connect это метод, который добавляет правило для роутера, а вот метода preview не существует.
Это обычное дело для Ruby, в случае когда метода не существует вызывается method_missing в котором можно делать полезные вещи. В нашем случае происходит следующее:

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


Теперь нужно удалить или переименовать public/index.html чтобы вместо этой сранички вызывался метод input и проверить что он действительно вызывается.

Настала пора вьюшкам показать что-то более полезное.



Начнем с input.rhtml, заменяем на такой код:

<code class='ruby' lang='ruby'><% form_tag preview_url do %>
<%= text_area_tag :text, @source, :size => '120x25' %>
<%= submit_tag 'Preview' %>
<% end %></code>


Получилась страничка с формой, которая будет запощена на preview_url, внутри формы текстовое поле и кнопка для отправки. Теперь возьмемся за форматирование введенного текста.

Сначала нужно решить как форматировать введенный текст. Эту статью я форматирую как markdown, а для разнообразия решил добавить textile.
Для поддержки textile и markdown потребуется установить RedCloth и Maruku.

<code>$>gem install redcloth maruku</code>


Теперь нужно написать код, который будет форматировать текст. К сожалению я не могу разместить код в статье, потому что хабр его режет, так что лучше открыть formatting_controller.rb в другом окне и переключаться по мере чтения. Что тут к чему.

  • require – подключает нужные гемы (модули, пакеты)
  • before_filter – добавляет метод set_supported_formats в очеред фильтров, которые вызываются перед вызовом экшена
  • params – хеш с параметрами, переданными в запросе


Для чего потребовался set_supported_formats и что означают все эти @?
Переменные со знаком @ вначале это переменные обьекта у которого вызывается метод — тоесть контроллера. Дело в том, что вьюшка имеет доступ к переменным контроллера, какбудто это её собственные переменные, поэтому обычно в контроллере выставляются переменные а во вьюшке они используются для рендеринга. В preview.rhtml мы будет рендерить также и вьюшку input.rhtml чтобы можно было отредактировать текст, поэтому @supported_formats потребуются в обоих вьюшках, лучше добавить фильтр чем дублировать код.

Осталось добавить выбор типа форматирования в input.rhtml:

<code><%= select_tag :selected_format, options_for_select(@supported_formats, @selected_format) %></code>


и написать preview.rhtml, я опять же не могу разместить код здесь (там есть div, и не важно что он внутри pre :).

Страничка разбита на три блока:

  • preview – отображает отформатированный текст
  • source – форма с исходным текстом
  • formated_text – поле с отформатированным текстом


Осталась одна маленькая деталь: получившиеся странички не “Well formed XHTML”, да и форма ввода текста кривовато выглядит. Нужно сделать чтобы браузер получал хорошо форматированные странички, т.е. нужен doctype, html, head, body, вобщем всё как положено, и причесать форму css’ом.

Нам нужен шаблон страницы в который можно вставить результат рендеринга вьюшки, в рельсах это называется layout.
Все что нужно сделать это добавить formatting.rhtml в app/views/layouts.

Теперь чуть лучше скомпануем форму ввода – style.css и положим в public/stylesheets.

Вот и всё на сегодня, первая часть закончена.



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

Наверняка из моего сумбурного описания не много понятно, просмотрев статью я понимаю что вопросов будет много. Например что такое form_for или options_for_select. Людям которым это действительно интерсно:

  • Если встретили незнакомое слово – зайдите на хороший сайт с документацией и наберите это слово в поиске
  • Если не знаете как что-то работает – читайте книгу о рельсах (она есть в emule) и задавайте вопросы


Желающие посмотреть как выглядит текст размеченный markdown могут взглянуть на исходник статьи.

Что может быть дальше?

  • Основное что я не затронул – это тесты, с них и начнем
  • Две странички слишком много для такого простого приложения, надо сократить до одной. Для этого нам понадобится познакомиться с AJAX и узнать как в рельсах работать с яваскриптом.
  • Я переживаю за сылки, я их все прощелкал и одна оказалась дохлая, больше щелкать мне уже не хочется, надо сделать чтоб не щелкать
  • А еще больше я переживаю за орфографию, подскажите какой сервис нормально может проверить орфографию, будет интересно прикрутить его к рельсам, если ещё не сделали =)
  • С появлением второй статьи хранить их исходники на рабочем столе станет обременительно (он и так захламлен :), так что надо будет сделать каталог статей. Заодно мы узнаем что такое REST и какое отношение он имеет к рельсам.
    Я заметил пост про AjaxScaffold без описания как им пользоваться, так что при желании можно сделать веб2нольный каталог на ActiveScaffold
  • Очень надеюсь что к этому моменту появятся соавторы и тогда мы познакомимся с тем, как организовать совместное редактирование статей. Узнаем как в рельсах осуществляется авторизация пользователей, как сделать статьи многоверсионными, как защититься от конкурентной записи.
Tags:
Hubs:
+15
Comments 25
Comments Comments 25

Articles