Ruby on Rails (в дальнейшем просто рельсы) это веб фреймворк, написанный на языке Ruby.
На хабре есть несколько статей о языке, думаю их будет полезно почитать, если возникнут затруднения – читайте википедию, лучшую книгу о языке – Programming Ruby, лучшую книгу о рельсах – Agile Development with Rails, и задавайте вопросы.
Пользователям Windows нужно скачать и установить One-click Ruby installer.
Пользователям Linux (Ubuntu) установить Ruby еще проще:
Убедимся что Ruby работает
и поставим рельсы:
Все что вам нужно для начала это текствый редактор с подсветкой синтаксиса Ruby и умение выполнять команды из консоли.
Для любителей IDE могу посоветовать Aptana, я пишу код в ней (мне просто нравится Eclipse :).
Все примеры я буду приводить для консоли, что делать в Aptana должно быть понятно, я могу написать об этом отдельно.
Проект на рельсах начинается с создания скелета проекта:
будет создана папка example и скелет проекта в ней (не забудьте заменить путь на свой). Посмотрим что внутри.
Самое время запустить веб-сервер и убедиться что приложение работает. Идем в папку с приложением и запускаем веб-сервер, поставляемый с рельсами:
http://localhost:3000/
Открываем эту линку в своем любимом браузере и наблюдаем страничку «Welcome aboard» – значит все хорошо и пришло время написать простенькое приложение.
Дело в том, что я умею писать текст с человеческой разметкой (Wiki, Markdown, Textile), но хабр поддерживает только html для разметки текста, а мне не удобно писать html когда я хочу просто написать текст.
Поэтому приложение будет форматировать текст в html!
Изначально оно будет очень простым, потребуется всего две странички: на первой можно будет ввести текст, а на второй посмотреть его в отформатированном виде и скопировать получившийся html (чтобы запостить на хабр :).
Для ленивых я выложил исходный код приложения, но все же писать код самому интереснее.
Думаю ни для кого не секрет что паттерн MVC стал де-факто стандартом архитектуры веб приложений. Рельсы не исключение, приложение состоит из моделей, вьюшек и контроллеров.
Сейчас и в будущем мы будем использовать скрипты которые сделают за нас всю рутинную работу, первый с которым мы познакомимся это
В результате рельсы сгенерировали несколько файлов из которых сейчас интересны следующие:
Как же увидеть сгенерированные страницы в браузере?
http://localhost:3000/formatting/input
http://localhost:3000/formatting/preview
За внешний вид урлов в рельсах отвечает модуль Routing, настроить его можно в файле
Сейчас я не буду вдаваться в детали роутинга, об этом можно написать отдельную статью. Сейчас просто добавьте эти две строчки и я обьясню их назначение.
connect и preview это вызовы методов. Первый аргумент это путь, в нашем случае путь пустой, тоесть это правила для корня сайта. Второй аргумент это хеш, который содержит какой метод у какого контроллера нужно вызвать и при каких условиях. Тоесть если приходит HTTP GET для корня сайта, то будет вызван метод input, а если HTTP POST, то preview.
Чем вызов connect отличается от вызова preview?
Connect это метод, который добавляет правило для роутера, а вот метода preview не существует.
Это обычное дело для Ruby, в случае когда метода не существует вызывается
Теперь нужно удалить или переименовать
Начнем с
Получилась страничка с формой, которая будет запощена на
Сначала нужно решить как форматировать введенный текст. Эту статью я форматирую как markdown, а для разнообразия решил добавить textile.
Для поддержки textile и markdown потребуется установить RedCloth и Maruku.
Теперь нужно написать код, который будет форматировать текст. К сожалению я не могу разместить код в статье, потому что хабр его режет, так что лучше открыть
Для чего потребовался
Переменные со знаком
Осталось добавить выбор типа форматирования в
и написать
Страничка разбита на три блока:
Осталась одна маленькая деталь: получившиеся странички не “Well formed XHTML”, да и форма ввода текста кривовато выглядит. Нужно сделать чтобы браузер получал хорошо форматированные странички, т.е. нужен
Нам нужен шаблон страницы в который можно вставить результат рендеринга вьюшки, в рельсах это называется
Все что нужно сделать это добавить
Теперь чуть лучше скомпануем форму ввода –
Не судите строго, я очень давно не писал на русском, все больше на Ruby :)
Наверняка из моего сумбурного описания не много понятно, просмотрев статью я понимаю что вопросов будет много. Например что такое
Желающие посмотреть как выглядит текст размеченный markdown могут взглянуть на исходник статьи.
Что может быть дальше?
На хабре есть несколько статей о языке, думаю их будет полезно почитать, если возникнут затруднения – читайте википедию, лучшую книгу о языке – 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 - Очень надеюсь что к этому моменту появятся соавторы и тогда мы познакомимся с тем, как организовать совместное редактирование статей. Узнаем как в рельсах осуществляется авторизация пользователей, как сделать статьи многоверсионными, как защититься от конкурентной записи.