вторник, 19 апреля 2011 г.

Впечатления от Ruby On Rails 3

Уже больше недели безвылазно сижу в Chromium, Sublime Text2 и консоли. На подходе дедлайн по дипломному проекту, а у меня еще куча работы. После месяца упорных трудов с Flask, понял таки, что писать на нем большой проект с нуля - мне просто не по зубам. Не тот масштаб, и многое делать придется в ручную.
Ввиду того, что уже давно поглядываю на всем известные и нагремевшие Ruby On Rails, решил таки посмотреть, что там и как. По основным требованиям мне нужна была хорошая поддержка MongoDB, а также просто хорошие инструменты разработки для быстрого старта. На Python, среди таких инструментов мог бы оказаться Django, но вот проблема поддержки MongoDB - к сожалению актуальна в некотором плане.
Для начала осмотрелся с драйверами для MongoDB. Сразу подвернулся Mongoid. Взглянул на доки, пускай местами скудные, и во многом с ссылками на ActionRecord, но вещь оказалась более чем достойна внимания. Это поставило точку в моих терзаниях. С горькими слезами по тому, что таки на Python даже MongoKit не умеет таких прелестей, на какие способен Mongoid, я скрепя сердце создал новый проект на рельсах.

Первой задачей для реализации веб-приложения, как и во многих случаях, стоит создание системы авторизации и регистрации пользователей. Для подобных задач нашелся Devise. На удивление очень мощный и красивый инструмент (плагиностроители для Django, учитесь какие плагины надо делать). Очень приятным сюрпризом стало также то, что он гибко настраивается, имеет много фишек, и в дополнение ко всему имеет встроенную поддержку Mongoid.
Второй задачей были мысли об административной панели. Нашел rails_admin, но увы. С Mongoid она пока не работает, хотя последний имеет поддержку интерфейса ActionRecord. Ну да ладно. До административной панели пока далеко. Нужна основная логика приложения.
Неделя упорного труда, и наконец сделан и дизайн, и настроен Devise, сделаны профили пользователей и настройка пользовательского аккаунта. Для новичка на рельсах думаю таки срок нормальный, хотя делая это на Django, убил бы себя об стену за такие сроки.
По мере написания всего этого добра, убедился, что к сожалению, но стоит сказать, что рельсы бьют по всем параметрам Django. Поддержка нескольких шаблонизаторов, популярных на Ruby, мощнейшая ORM (одни только возможности представления связей и запросов по ним чего стоят, и это касается не только ActiveRecord, но и Mongoid.) Формы по моделям, куча и тонна HTML хелперов, гибкая система организации шаблонов, и прочее и прочее. В принципе, и на Django можно писать неплохо в этом контексте.
Также, встретился и со многими интересными таки задачами. Rails помимо всего прочего таит в своих недрах много кунштюков и секретов. Главное знать о них. К примеру, когда форма выдавала мне ошибочные поля в обрамлении div'ов, что ломало весь мой дизайн, полазив по нетам, вышел на RailsCasts, где нашел способ изменения поведения рельсов в этом контексте, а в комментариях нашел ссылку на хороший сниппет, модифицировав который, легко добился желаемого мне поведения.
Несмотря на сложность Ruby как такового, его навороченности, после Python довольно легко пишется, особенно когда есть куча примеров. Особых сложностей для тривиальных задач возникнуть не должно вовсе. Особенно, если есть хотя бы опыт работы с каким нить питонячим фреймворком (пускай даже не на уровне проекта, а просто барахтания в песочнице на посмотреть).
Впечатления получил приятные, и пока не пожалел ни разу, что решил взглянуть на этот замечательный инструмент, и положил опыт работы с ним к себе в копилку. Пусть и небольшой этот опыт. И еще раз конечно пожалел, что на Python кажется таких инструментов нет. Может конечно, я и не прав, говорят Pyramid с repoze.bfg там крутые вещи мутят, но их трогать пока побоялся.
Сделал для себя вывод: надо чаще осматриваться по сторонам, смотреть на инструменты, которые предлагают многие люди. Среди них много хороших вещей. А рельсы вполне можно осваивать и новичкам вместо Django. Правда с оглядкой на то, что документация у рельсов все же слабее в плане структурированности и последовательности. А также их стандартный Guide слаб откровенно. Хотя... Python приучает к хорошей документации :)