rails


Предыдущая статья про Ruby on Rails, как всегда, выродилась в грандиозный флейм вокруг PHP. Кто-то говорит, что Rails в самое ближайшее время вытеснит PHP на свалку истории, кто-то говорит, что Rails будет портирован на PHP и на свалку истории отправится как раз Ruby. Все остальные мнения — где-то посередине между этими крайностями.

Я считаю, что Rails займет нишу элитарного инструмента, а PHP продолжит доминировать в категории языков, совместимых с лоботомией. Но это тема для другой статьи…

Сегодня же давайте рассмотрим следующую по популярности тему религиозных войн Rails vs. Django vs. PHP — движки HTML-шаблонов. На самом деле, спор чаще всего идет о синтаксисе шаблонов. Такие особенности конкретных движков, как скорость рендеринга, способ обработки ошибок и т.д. с точки зрения религиозных войн не так интересны.

О важности качественного языка шаблонов

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

Таким образом, проблема продуктивного создания HTML-шаблонов является одной из ключевых проблем повышения продуктивности веб-разработки вообще.

Краткая классификация

Шаблонизатор — это библиотека, позволяющая с помощью специализированного синтаксиса описывать разметку динамических HTML-страниц. Разметка описывается в виде так называемых шаблонов. На основе шаблонов и данных, как правило, предоставленных кодом бизнес-логики (клинические случаи с включением бизнес-логики в шаблоны рассматривать не будем) генерируется результирующий HTML.

Большинство языков шаблонов относится к одной из следующих категорий:

Категория 1. Винегрет из кода и HTML

Шаблонизаторы данной категории позволяют с помощью специального синтаксиса вставлять в HTML блоки исполняемого кода, написанного на языке общего назначения (Java, PHP, Ruby и т.д.).

Примеры шаблонов этой категории: PHP, ASP, JSP, ERb (стандартный шаблонизатор в Ruby on Rails).

Пример синтаксиса:

<% for recipe in @recipes %>
  <tr>
    <td><%= link_to %Q{#{recipe.title}}, :action => 'show', :id => recipe %>
        <%= link_to '(delete)', { :action => 'destroy', :id => recipe },                             
                    :confirm => 'Are you sure?', :post => true %></td>
    <td><%= link_to %Q{#{recipe.category.name}},
                    {:action => 'list', :category_id => recipe.category.id} %></td>
    <td><%=h recipe.date %></td>
  </tr>
<% end %>
</table>

Категория 2. Специализированный синтаксис + HTML

Шаблонизаторы данной категории тоже работают за счет вставки управляющих блоков в HTML. В отличие от предыдущей, категории управляющие блоки написаны не на языке общего назначения, а на узкоспециализированном языке, как правило, используемом только в данном шаблонизаторе.

Примеры шаблонов этой категории: движок шаблонов Django, Smarty

Пример синтаксиса (Django):

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

Категория 3. Основанные на XML

Тот же самый принцип вставки управляющих элементов в HTML, что и в предыдущих категориях. Управляющие блоки выполнены в виде XML-элементов, ссылающихся на функции бизнес-логики или библиотек пользовательского интерфейса.

Примеры шаблонов этой категории: Velocity, ASP.NET

Пример синтаксиса:

<form runat="server">
  Enter a number from 1 to 100:
  <asp:TextBox id="tbox1" runat="server" />
  <br /><br />
  <asp:Button Text="Submit" runat="server" />
  <br />
  <asp:RangeValidator
    ControlToValidate="tbox1"
    MinimumValue="1"
    MaximumValue="100"
    Type="Integer"
    EnableClientScript="false"
    Text="The value must be from 1 to 100!"
    runat="server" />
</form>

Категория 4. Специализированный язык разметки

Шаблоны данной категории целиком написаны на DSL (Domain-Specific Language), отвечающем за генерацию как динамического содержимого, так и, собственно, HTML-разметки.

Примеры шаблонов этой категории: HAML, Markaby

Пример синтаксиса (HAML):

!!!
%html
  %head
    %title= controller.controller_name
    = stylesheet_link_tag 'main'
  %body
    #header
    %h1 BoBlog
  #content= yield
  #footer
    %p All content copyright © Bob

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

Сейчас попробую объяснить, почему.


Feel the pain

Ни один из первых трех примеров нельзя назвать эстетичным. Даже близко. От кода рябит в глазах и надо внимательно вчитываться, чтобы понять, что действительно делает любой из этих шаблонов. Если сравнить синтаксис этих примеров с синтаксисом любого современного языка программирования, то можно понять, насколько все плохо в области создания эстетичных шаблонов (впрочем, надо признать, что разнообразие структурных элементов языка программирования как минимум на порядок меньше разнообразия HTML-тегов).

Вставка программного кода в той или иной форме резко нарушает структуру HTML и делает результат весьма трудным для чтения. Казалось бы, основная проблема существующих шаблонизаторов — в уродливом синтаксисе вставляемых в HTML элементов.

Ничего подобного.

Главная проблема большинства шаблонизаторов в том, что уродлив сам синтаксис HTML.

Этот кривой HTML

HTML избыточен и некрасив. Разметка содержит множество элементов, без которых можно было бы обойтись. Сами элементы тоже нельзя назвать образцом изящества. Подробности далее…

Немного истории

Давным-давно, в 60-х годах прошлого века был создан SGML, абстрактный язык разметки для представления максимально разнообразной информации в виде структурированных, пригодных для машинного чтения, данных. За универсальность SGML пришлось платить сложностью и громоздкостью синтаксиса. Этот недостаток SGML в полной мере распространяется на его потомков, HTML и XML.

HTML сложно читать.

Простота чтения языка программирования зависит, в первую очередь, от двух параметров:

Лаконичность. В первую очередь определяется количеством строк, необходимых для описания чего-либо. Во вторую очередь, длинной ключевых слов и других часто встречающихся элементов.

Пара примеров:

Java. Все плохо как с количеством строк, так и с их размером:

void cancelAll(Collection<TimerTask> c) {
    for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); ) {
        i.next().cancel();
    }
}

Python. Практически образец лаконичности:

def cancel_all(tasks):
    for task in tasks:
        task.cancel()  

Понятность. Хорошо, когда код лаконичен, но он должен быть еще и понятен. Для этого необходимо, чтобы язык был построен на простых принципах и обладал концептуальной целостностью. Под концептуальной целостностью я подразумеваю способность языка быть выраженным через небольшое количество принципов с минимумом исключений. Примером языка с высокой концептуальной целостностью можно назвать Python.

Именно из-за проблем с понятностью синтаксис Perl’а, часто называемого write-only языком, нельзя считать удовлетворительным. Вот здесь, например, Steve Yeggie пишет как оператор .. в Perl может, в зависимости от контекста, иметь два абсолютно разных значения. Само собой, такие фокусы способствуют читабельности кода не лучше, чем выражение goto.

Можно предположить, простота чтения языка разметки зависит от тех же ключевых параметров: лаконичности и понятности.

С понятностью у HTML все в порядке: принцип построения документа из тегов способен без особого труда понять даже ребенок. А вот с лаконичностью…

HTML — ну очень многословный язык. Многие часто используемые теги имеют весьма длинные имена. Многие типичные конструкции (например, label и legend) приходится делать с помощью отдельного тега, хотя в большинстве случаев достаточно было бы атрибута. Нет универсального обозначения конца блока, аналогичного end в Ruby или закрывающей фигурной скобке в C-подобных языках — каждый блок HTML закрывается по-своему, в соответствии с именем открывающего тега, следовательно, читателю сложнее распознавать строки, не несущие полезной информации.

Буков много (c)

HTML сложно писать.

Пример из жизни.

В WordPress для написания постов можно использовать WYSIWG-редактор (What You See Is Shat You Get, можно перевести как “что видишь в редакторе, то и получишь в результате”), а можно писать чистый HTML. В моей версии WordPress WYSIWG кривой и то что я вижу в редакторе совсем не соответствует тому, что я получаю на выходе. Причиной проблем является большое количество паразитной разметки, генерируемой упомянутым редактором: пустые теги <p>, пустые теги <b> и <i>, время от времени появляющийся в конце текста незакрытый тег <a>… В результате, для того чтобы написанный пост выглядел хорошо, приходилось руками вычищать HTML.

Через некоторое время я убедился, что вручную писать правильный HTML быстрее, чем вручную же вычищать автоматически созданный. И я стал писать посты в чистом HTML. Жизнь стала легче, но это все же нельзя было считать удовлетворительным решением. Скорость написания форматированного текста в HTML не сравнится со скоростью создания форматированного текста в том же MS Word.

Сейчас я пишу свои тексты с помощью Markdown, специализированного языка разметки. По сравнению с HTML я получаю более симпатичный и читабельный исходный текст, который, к тому же, гораздо проще писать. В результате достигнута заметная экономия времени, притом за счет упразднения самого нудного аспекта создания постов. Мои исходные затраты на поиск и изучение специализированного языка разметки давно окупились. Учтите, что на блог я трачу совсем немного времени. Использование подходящего специализированного языка разметки в работе может принести гораздо большую отдачу.

Небольшое сравнение HTML и Markdown для иллюстрации.

HTML:

<p>Small example of Markdown syntax</p>

<ol>
<li>Red</li>
<li>Green</li>
<li>Blue</li>
</ol>

<p>If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:</p>

<pre><code><blockquote>
    <p>For example.</p>
</blockquote>
</code></pre>

Markdown:

Small example of Markdown syntax

1.  Red
2.  Green
3.  Blue

If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:

    <blockquote>
        <p>For example.</p>
    </blockquote>

Подводя итог, можно сказать, что использование HTML в качестве основы языка шаблонов заставляет платить читабельностью и лаконичностью синтаксиса. Появление таких платформ веб-разработки как Django и Ruby on Rails делает эту цену слишком высокой. Чтобы не путаться под ногами, язык шаблонов должен быть проще.

HAML как альфа-версия шаблонизатора будущего

Показанный выше Markdown очень эффективно решает задачу безболезненного написания HTML, но в относительно узкой нише — написание текстов. Того же самого для несколько более широкого спектра задач добиваются разнообразные wiki-разметки.

Шаблонизатор HAML пытается с использованием тех же принципов создать читабельный и лаконичный синтаксис HTML-шаблонов общего назначения. Дело, как говорится, благородное.

Посмотрим, как у него это получается?

Преимущества

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

Рассмотрим основные преимущества подробнее:

  • Наличие сокращений для большинства часто используемых элементов.

    • Какие два атрибута тегов используются чаще всего? Class и id. В HAML <tr class="odd" id="first_row"> превращается в %tr#first_row.odd. Используются те же обозначения что и в CSS, что заметно упрощает обучение.
    • Большинство ключевых слов состоят из одного символа: %, =, -, ., #. Думаю, не нужно говорить, насколько это сокращает получающийся в итоге код.
    • Любители верстки divами (а это заметная часть прогрессивного человечества) могут наслаждаться тем, что div является тегом по умолчанию. #header и %div#header — одно и то же.

    Это только самое основные сокращения. Полный список можно посмотреть в HAML Reference

  • Способ обозначения блоков. Блоки в HAML обозначаются с помощью отступов, аналогично Python. Вот такой код: %one %two %three Hey there преобразуется в: Hey there

    Можно по-разному относиться к Python’овскому стилю обозначения блоков (лично я — его большой поклонник), но нельзя не признать что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML (я уже писал про связанные с ними проблемы).

  • Возможность сочетать HAML и ERb в одном приложении. Допустим, нужно найти шаблон с именем ‘xyz’ (или partial, не суть важно). Плагин HAML переписывает стандартный загрузчик шаблонов так, чтобы сначала пытаться загрузить xyz.haml, а в случае неудачи — xyz.rhtml. Соответственно, можно не переписывать все ERb-шаблоны в проекте на HAML, а заменять их по одному и только там, где это наиболее оправдано.

Проблемы

HAML пока используется относительно небольшим количеством людей. Версия 1.0 была выпущена только два месяца назад, 15 января 2007 года. В результате, общая стабильность не может, разумеется, сравниться с ERb, а ваши шансы столкнуться в своем проекте с неизвестными багами гораздо выше.

Но это только абстрактные размышления.

Из конкретных проблем я встречался только со сложностью отладки. HAML реализован таким образом, что шаблоны компилируются в ERb, который затем рендерится с помощью ERb-библиотеки. В результате, в случае ошибки Stack Trace ссылается на фрагмент ERb-шаблона, который вы никогда не увидите целиком. Диагностика проблем в таких условиях может быть очень нетривиальной.

Грядущее упрощение языков разметки?

Я считаю, что существует четкий тренд развития языков разметки в сторону упрощения чтения и редактирования человеком. У HTML и XML, сегодняшних стандартов де-факто, с этим серьезные проблемы. Их синтаксис нацелен на максимальную универсальность применения и простоту парсинга, и жертвует при этом компактностью, а следовательно, легкостью чтения и редактирования. Такая ситуация не может быть сохраняться бесконечно.

Языки программирования со сборкой мусора (garbage collection) вытеснили из большинства ниш языки с непосредственным управлением памятью. Динамические языки вытесняют языки со статической типизацией. Оба этих изменения направлены на экономию времени разработчика за счет снижения производительности. Подобное изменение ждет и языки разметки.

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

  • Шаблонизаторы категории “Винегрет” продолжают использоваться в большинстве PHP-разработок. Разработчики, обладающие достаточной квалификацией для использования продвинутых шаблонизаторов типа Smarty (и, что важнее, достаточной квалификацией, для того чтобы понять, зачем это нужно) будут постепенно откочевывать в сторону Rails, Django и других подобных фреймворков, которые наверняка появятся в ближайшем будущем.

    Шаблонизатором по умолчанию в Ruby on Rails 2.0 становится HAML, тем самым выводя Rails из группы платформ, использующих “Винегрет”.

  • Шаблонизаторы на основе специализированного синтаксиса + HTML также теряют часть своей аудитории в пользу HAML сотоварищи. Тем не менее, данная категория остается достаточно популярной благодаря простоте синтаксиса и возможности четкой диагностики ошибок. Именно такими шаблонизаторами, в большинстве своем. пользуются дизайнеры и HTML-верстальщики, не желающие/не способные переучиваться на без-HTML’ный DSL.

  • XML постепенно отступает в нишу машинной сериализации данных. С этой точки зрения громоздкость его синтаксиса не является большим недостатком (хотя и увеличивает объем трафика при передаче данных по сети). Гораздо важнее простота парсинга и возможность формальной валидации. Ruby, Python и другие динамические языки активно переходят к использованию вместо XML «облегченных» форматов, в частности YAML.

    Шаблонизаторы на основе XML, вероятно, сохранят популярность в C# и Javа. Хотя замена таких шаблонизаторов на более «легкие» решения и предоставляет значительные возможности экономии времени разработчиков, сознательный выбор языка со статической типизацией говорит о том, что скорость разработки, скорее всего, не является первым приоритетом при выборе технологий в данном проекте. В таких условиях использование XML вполне адекватно.

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

  • Столица, разумеется, переносится в Нью-Васюки :)

Материалы по теме

  • Серия статей Ивана Сагалаева с критикой использования XHML вместо HTML. Отлично изложены аргументы, доказывающие ущербность оптимизации парсинга разметки за счет увеличения трудоемкости ее создания.

Спасибо Артему Скорецкому и Анатолию Иванову, читавшим черновики этой статьи и внесшим немало ценных идей.

Некоторое время назад нами был начат проект по разработке веб-приложения для специфических нужд нашего заказчика. Первая версия готова к сдаче в эксплуатацию. Проект был сделан на Ruby on Rails силами одного человека (меня) в течение месяца. Хочу поделиться первыми впечатлениями от реального использования фреймворка.

Что такое Ruby on Rails

Ruby on Rails — это современный высокоуровневый фреймворк веб-разработки. Создатели утверждают, что Ruby on Rails позволит в разы повысить продуктивность веб-разработчиков по сравнению с предыдущими популярными технологиями, такими как PHP. Версия 1.0 вышла в прошлом году и с тех пор Ruby on Rails быстрыми темпами набирает популярность.

В целом, при работе с Rails возникает ощущение, что попал в светлое завтра веб-разработки. На вещи, которые делаешь в первый раз, времени уходит столько же, сколько на реализацию того же самого в десятый раз на том, с чем я работал раньше. Начиная со второго раза – в два-три раза меньше. Сравниваю, в первую очередь с PHP, ASP и ASP.NET, с которыми я более-менее серьезно работал в прошлом, и с Django, знакомым по паре микроскопических проектов, сделанных для собственного удовольствия.

Сам по себе Ruby тоже очень хорош. Пока не могу понять, нравится ли он мне больше, чем Python… Но то, что больше всего остального — совершенно точно.

5 самых приятных моментов Ruby on Rails

  1. Schema Migration. Как правило, одной из основных проблем разработки программных продуктов является сложность внесения изменений в структуры базы данных. В результате возникает желание спроектировать всю структуру заранее, что плохо согласуется с итеративной разработкой. Разработанная заранее структура часто не полностью соответствует логике приложения. Кроме того, не всегда понятно в каком виде хранить структуру данных. В единственном экземпляре на тестовом сервере? Класть дамп БД в систему управления версиями?

    Rails помогает решить все эти проблемы с помощью входящих в него функций эволюционного преобразования структуры БД (Schema Migration). Вы описываете исходную структуру БД, а затем описываете каждое изменение в виде так называемой «миграции», описывающей операции по обновлению структуры БД до следующей версии. В миграциях легко описываются как стандартные, так и весьма нетривиальные на некоторых платформах преобразования (переименование таблиц и полей). Rails хранит в базе версию ее структуры, что позволяет надежным и предсказуемым образом обновить любую БД до последней версии. Гораздо проще использовать миграции, чем пользоваться дампом тестовой БД и потом мучительно пытаться обновить устаревшую БД заказчика, не потеряв по дороге данные. Кроме того, миграции позволяют вернуть структуру БД к предыдущей версии, что очень полезно, когда в установленной у заказчика новой версии обнаружилась критическая ошибка. Имея возможность откатить структуру БД к более старой версии, вы можете спокойно вернуть все приложение к последней стабильной версии и без суеты начать исправлять ошибку. Куда безопаснее, чем пытаться героическими темпами исправить проблему прямо на сервере заказчика.

  2. Rake. Также в состав Rails входит Rake (инструмент сборки, аналогичный Make) и комплект стандартных задач к нему. В результате вы, как минимум, сэкономите за время написания и тестирования приложения немало времени на выполнении стандартных операций — очистке логов и временных файлов, обновлении структуры БД, запуске тестов и т.д. Если же вы знаете, как пользоваться подобными инструментами сборки, то вы получаете мощную базу для дальнейшей кастомизации, экономя при этом кучу времени на написание того же самого с нуля. В дополнение к Rake существует Capistrano — утилита, предназначенная для выполнения задач на нескольких серверах, позволяющая существенно упростить развертывание вашего приложения.

  3. Convention over Configuration. Этот принцип архитектуры Rails можно перевести как «соглашения вместо настроек», а его использование призвано свести к минимуму количество стандартного кода, которое вы пишете. Фактически, речь идет об очень продуманной системе значений по умолчанию. Речь идет не только о значениях по умолчанию в методах стандартной библиотеки. Например, стандартно названные «куски» вашего приложения будут автоматически связываться друг с другом без вашего участия — класс данных Work будет по умолчанию считать себя представляющим данные таблицы works и т.д. Можете попрощаться с шаблонным кодом инициализации и списком импортов на треть страницы.

  4. Поддержка автоматизированного тестирования. Ruby on Rails делает все возможное для того, чтобы писать автоматизированные тесты для вашего приложения было как можно проще. Режим тестирования позаботится о том, чтобы отправленные в тестах письма никуда не ушли, чтобы тестовые данные никак не соприкасались с рабочими, а изменения в БД, сделанные одним тестом, не влияли на следующий. Rails включает библиотеки для поддержки блочного, функционального, интеграционного и нагрузочного тестирования

  5. Красивые URL’ы. Rails четко отделяет URL’ы от имен файлов, названий методов и прочих сугубо внутренних деталей вашего приложения. При этом вместо sites/view.php?id=245 вы получаете /sites/245 и для этого не приходится копаться в .htaccess-файлах на каждой машине, где оно будет стоять. Синтаксис схемы URL’ов гораздо понятнее, чем синтаксис настроек mod_rewrite и к тому же избавляет вас от предположения, что в качестве веб-сервера обязательно будет использоваться Apache. Дополнительный бонус — функция формирования ссылок использует для формирования URL’ов имена ваших классов и методов. В результате вы можете перенастроить схему URL’ов не меняя при этом ни строки кода в вашем приложении – и все будет работать.

Здравствуй, грабли!

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

  1. ERb, движок шаблонов, используемый в Ruby on Rails, ведет к появлению безумной мешанины кода и HTML, так характерной для PHP-программ сомнительного качества. Вот кусок одного из моих шаблонов:

    <td class='site_description'><%= truncate(site.human_description, 60) %></td>
    <td class='site_edit'><%= link_to 'Edit', edit_site_url(:id => site.id) %></td>
    <td>
      <% if site.works.empty? and site.estimates.empty? %>
        <%= link_to 'Add&nbsp;estimate', :controller => 'estimates',
              :action => 'new', :site_id => site %>
      <% else %>
        <%= link_to 'Add&nbsp;work', :controller => 'works',
              :action => 'new', :site_id => site %>
      <% end %>
    </td>
    

    Не очень эстетично, правда? А ведь это стандарт… Есть как минимум одна неплохая альтернативная реализация, но версия 1.0 вышла только месяц назад, и, кто знает, сколько еще пройдет времени до того, как она получит более-менее заметное распространение.

  2. Валидация данных как будто гвоздями прибита к моделям. Так хорошо интегрирована, что захочешь — не отдерешь. Отличное решение, если вам надо работать с данными, хранимыми в БД. Так что пока идет реализация функций редактирования данных — все танцуют. Легко и изящно решены и такие относительно распространенные вещи как проверка согласия с user agreement’ом. Потом настает очередь настраиваемых отчетов и продвинутого поиска. И, сюрприз! — вы в жопе… Стандартная валидация не работает. То есть совсем. Потому что модели данных, на которую можно завязать поля вашей формы продвинутого поиска не существует в природе. Не сомневаюсь, что есть грязный трюк, с помощью которого можно обойти эту проблему, но найти его за разумное время мне не удалось. Два балла.

  3. Совершенно ужасны стандартные Date и Time control’ы. Date control выглядит вот так:

    Date control in Ruby on Rails

    Time control ничем не лучше. Кроме того, у этих control’ов бывают проблемы с валидацией. А если использовать их без привязки к ActiveRecord, то придется вручную собирать дату или время из отдельных «кусочков», полученных в виде параметров. Стыд и позор! Сравните с тем, как это выглядит в Django:

    Django Date and Time controls.

    Без комментариев.

  4. Урезанная поддержка БД по умолчанию. Настоящим ковбоям не нужны удаленные ключи! Мало того, что удаленные ключи отключены по умолчанию, библиотека миграций еще и не включает в себя функций по их созданию. Придется писать свои. Так же по никто и не подумает автоматически создать для вас индекс по полю удаленного ключа. Так что тем из нас, кто использует для production что-то посерьезнее SQLite, придется совершить несколько больше ручных манипуляций, чем предполагает дух Ruby on Rails.

    В принципе, если вы редактируете данные только через ваше приложение, написанное на Ruby on Rails, то это не особенно серьезная проблема — Rails и сам неплохо справляется с поддержанием целостности данных. Но если с базой взаимодействуют другие приложения или вы часто меняете данные непосредственно через SQL-консоль, то отсутствие удаленных ключей может оказаться весьма неприятным сюрпризом.

  5. Я столкнулся с мистическими багами ruby 1.8.5 на FreeBSD 5.4. В ряде случаев Ruby падает, выдавая Core Dump. В частности, не работает Rake, проваливаются несколько тестов в плагине acts_as_authenticated и где-то раз в сутки (update: уже каждые пять минут) падает mongrel. Неприятно. Проблема, скорее всего в железе или операционке, “но неприятных осадок остался”. Как решится — напишу.

На этом список неприятностей заканчивается. Для меня ничего из перечисленного даже близко не стоит с ViewState и необходимостью использовать IIS (ASP.NET) или отсутствием namespace’ов в языке (PHP).

Хочу подчеркнуть что «проблемы» Rails, как правило, заключаются в том, что фреймворк устанавливает у разработчика высокие ожидания относительно уровня абстракции. Когда из-за закона дырявых абстракций некоторые вещи приходится реализовывать на более низком уровне, сравнимом с тем, который предлагает, например, PHP — разработчик ощущает разочарование. Так что перечисленные проблемы вовсе не являются основанием не использовать Rails, это скорее список возможностей, упущенных создателями. Учитывая, что текущей версией является все лишь 1.2, возможностей улучшить ситуацию будет предостаточно. И даже с учетом всех этих проблем скорость и удобство создания нового веб-приложения на Ruby on Rails в разы превосходит таковые на старых платформах.

Выводы

Настоятельно рекомендую хотя бы попробовать Ruby on Rails. Даже если в ближайшее время вы не сможете использовать Rails в своей непосредственной работе, то его все равно стоит изучить. Почувствовав стиль и принципы Ruby on Rails, вы поймете к чему надо стремиться, а это поможет вам при разработке веб-приложений на любом языке и любой платформе.

Материалы по теме

  • RubyOnRails.com. Домашняя страница проекта.

  • RubyOnRails.ru. Она же на русском.

  • Ruby on Rails Tutorial, Revisited (part 1). Хороший Tutorial, с лихвой окупающий пару часов, которые надо потратить на его вдумчивое освоение. Состоит из двух частей, ссылка на вторую часть есть где-то в конце первой, поэтому не буду ее здесь приводить.

  • Отличная шпаргалка по Ruby on Rails. Кратко описывает все самые важные вещи на одной (пусть и большой) странице. Открыта у меня постоянно и используется не реже чем Rails API.

  • Русскоязычная дискуссионная группа о Ruby on Rails. Основное место живого общения о Ruby on Rails на русском языке. 20% тем хороши, информативны и полезны для разработчиков самого разного профессионального уровня. Ну а 80% тем, как и в любом другом месте — полный мусор.