Что мне приглянулось в Ruby on Rails

    Начну с того, что я программист на РНР с неплохим опытом. Было написано много интересного, были крупные проекты, сервисы в сферы телекоммуникаций, покрывающие почти всю Европу. Разработка и поддержка проектов велась не месяц-два, а год-полтора.

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

    Взгляд пал на Руби он Рейлс. Была прочитана знаменитая Agile Web Development with Rails: Second Edition и написан небольшой проект. Здесь я попытаюсь перечислить те возможности этого прекрасного фреймворка, которые приглянулись мне. Если вы не планируйте писать на рейлс, то думаю вам всё-таки будет интересно познакомиться с некоторыми вкусностями, которые можно без труда портировать на другие языки (многое уже сделано для РНР, в том числе и мной).

    Каркас приложения (дело вкуса)
    Да-да. Хоть многие и будут кричать, что это ограничение их свободы, но как показывает мой опыт — многих программистов просто необходимо ограничивать. Структура рейлс очень логична. Каждому компоненту есть своё место. Очень чёткое разделение компонентов MVC.

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

    Контроль версии базы данных (необходимо в крупных проектах)
    Database migration. Все изменения, которые вы делаете с базой: создание таблиц, добавление индексов и т.д. — помещаются в код приложения и хранятся в вашей системе контроля версий (у меня SVN). Каждая миграция выглядит примерно так

    class AddEmailColumnToOrders < ActiveRecord::Migration
    def self.up
    add_column :orders, :e_mail, :string
    end

    def self.down
    remove_column :orders, :e_mail
    end
    end

    Удачный Active Record (мощная библиотека)
    Простота создания моделей для работы с объектами базы изумительна.

    class Order < ActiveRecord::Base
    end

    Этого достаточно для работы с таблицей orders. Никакого явного мэпинга. Очень удобно и гибко реализованы связи между сущностями.

    Тестирование (необходимо в крупных проектах)
    Тут одни эмоции. Есть три типа тестов:
    1. юнит тесты моделей — а ля JUnit, PHPUnit (это знакомо),
    2. функциональные тесты — те же юнит тесты, но для контоллеров,
    3. интеграционные (?) тесты целых сценариев работы веб-приложения; код всё скажет за себя

    def test_buying_a_product
    dave = regular_user
    dave.get "/store/index"
    dave.is_viewing «index»
    dave.buys_a @ruby_book
    dave.has_a_cart_containing @ruby_book
    dave.checks_out DAVES_DETAILS
    dave.is_viewing «index»
    check_for_order DAVES_DETAILS, @ruby_book
    end

    Это тестирование приложения на самом высоком уровне.

    Кеширование (необходимо в крупных проектах)
    Тут мне понравились 2 вещи. Первая — это кеширование страницы. Предположим по урлу /products/details/1 вы выводит описание товаров. Рейлс может создасть файл /products/detail/1.html в директории public, который будет отдаваться вебсервером как статический контент. Понятное дело, что это отлично отразится на производительности.
    Вторая вещь — это наблюдатели (observers) моделей, в которых вы определяете когда следует очищать кеш. Например,

    class ArticleSweeper < ActionController::Caching::Sweeper
    observe Article
    # If we create a new article, the public list of articles must be regenerated
    def after_create(article)
    expire_public_page
    end
    # If we update an existing article, the cached version of that article is stale
    def after_update(article)
    expire_article_page(article.id)
    end
    # Deleting a page means we update the public list and blow away the cached article
    def after_destroy(article)
    expire_public_page
    expire_article_page(article.id)
    end
    end

    Яваскрипт (удобно)
    1. хорошая интеграция с prototype,
    2. богатый выбор хелперов для разработки аяксовых компонентов приложения,
    3. генерация яваскрита при помощи шаблонов RJS (это тип представления из MVC); выглядит примерно так

    page.replace_html(«cart», :partial => «cart», :object => cart)
    page[:current_item].visual_effect :highlight, :startcolor => "#88ff88", :endcolor => "#114411"

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

    Читабельные урлы (удобно)
    Просто и логично сделана реализация распознавания и генерирования friendly URL.

    map.connect 'store/checkout', :conditions => { :method => :get }, :controller => «store», :action => «display_checkout_form»
    map.connect 'store/checkout', :conditions => { :method => :post }, :controller => «store», :action => «save_checkout_form»

    Дополн.
    Отладка и прочее (удобно)
    Встроены скрипты профайлера и бенчмарка. Метод breakpoint, вызванный в акшионе контроллера, прерывает работу скрипта страницы, позволяет вам выполнить любые действия с приложением через консоль, а потом продолжить выполнение скрипта.

    Это то немногое, что я могу вспомнить в 11 часов вечера. Начинать холивары запрещено. Я просто перечислил то, что хотел бы видеть во всех проектах.
    Поделиться публикацией

    Комментарии 99

      +1
      ну наконец хоть что-то в этом блоге появилось)))
      про тестирование - А вы пробовали RSpec? ;-)
        +1
        Нет. Только обычный Test::Unit. Уже второй раз слышу про RSpec - значит, посмотрю :)
          0
          Нет, только Test:Unit. уже второй раз слышу о RSpec - значит, посмотрю.
            0
            Если бы по нему еще кто-то написал вменяемую доку - было бы вообще волшебно. А то сейчас на вопросы о документации обычно посылают читать тесты для самого rspec. Я в свое время тоже так мельком сунулся, но сроки давили как обычно и я плюнул и остался на обычных тестах.
              0
              Говорят, лучше хоть какие-то тесты, чем вообще никаких.
          0
          Когда уже сделают прекомпилятор для ruby?
          Все прекрасно, скорость разработки потрясная, но работает ОЧЕНЬ медленно, даже вторые рельсы.
          ДА ускорили роутс, да актив рекорд можно отключить при желании, и искать через sql, да можно и то и другое вместе использовать, но где скорость, блин?
          Да мне нравится ruby, после него не хочется писать ни на чем другом :) Но посмотрите на твиттер, его ж лихорадит! Скажите, что до твиттера еще дорасти надо? Вы правы, но уже на полпути сайт станет проигрывать в скорости сами_знаете_на_чем_написанным.

          Кто-нибудь знает как максимально ускорить работу rails сайта с часто изменяемыми страницами, где кеширование (полное,частичное) уже не помогает?
          • НЛО прилетело и опубликовало эту надпись здесь
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                Про твиттер , почему ж я не мог зайти буквально сегодня? Открылся спустя пару минут.
                Если вы знаете - то поделитесь из-за чего у них трудности? БД? Polling? Насколько мне известно это самый нагруженный rails проект в сети.
                Большое спасибо за ссылку!
                Про YARV имеются конкретные тесты?
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Про esi вспомнил, все же хороший вопрос, что вы используете в продакшен ? mongrel - esi?
                    Мне кажется кеширование это все таки отодвигание проблемы на более позднее время. И по
                    моему не решение проблемы с производительностью самого интерпретатора. Как думаете? Хотелось бы увидеть тесты с тем же пхп, пусть такие же синтетические.
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Вопрос, mysql (или что у вас БД) на той же машин установлен?
                          • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          достаточно хорошие результаты!
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    0
                                    Перед тем как ковыряться в старлинге, спрошу:
                                    - что там за архитектура такая сверхустойчивая?
                                    - командует напрямую мемкешедем ?
                                    - можно ли на несколько кластеров обработку очереди запихнуть?
                    0
                    да, как уже сказали, есть 1.9 с YARV, но мне кажется, что стоит ждать следующуюю ступень - Rubinius... Как говорят (сам я пока его еще не тестировал ни коем образом, так что говорю голосовно) - прирост скорости ощутим...
                      0
                      Поделитесь пожалуйста вашими цифрами - сколько вы намерили и на каком железе (2, 4, 8 процессоров...)
                      Можно в личку, если данные не хочется разглашать.
                      0
                      RSPEC - Cool
                      But not enough documentation:)
                        0
                        ilike.com и scribd.com Отлично работают на рельсах.
                        Если у вас что-то начинает тормозит всегда можно найти, что оптимизнуть. Erb заменить например на erubis. Есть альтернативы активрекорду. Добавить монгрелов...
                        А то все говорят что рельсы медленные, а сами на них толком и не писали. Нормальные они :)
                          –2
                          Ну альтернатива актив рекорду всегда есть )) это sql (если без других примочек конечно)
                          Рельсы в принципе не могут быть медленные, претензии к тому на чем они выполняются к руби.
                          Насчет монгрелов на одной среднестатистической машине имхо не стоит более 8 запускать.
                          А вообщем интересно, как с помощью монгрелов делать множественный аплоад на сервер?
                          Ну вот к примеру монгрил кластер из 4 монгрилов, 4 пользователя грузят файл. Тут даже ДДОС не надо.. Есть выходы(особенно к modaz вопрос)?
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Не моделировали? А попробуйте :)) Загрузите 4 монгрила четырьмя запросами по закачке больших файлов. Поскольку Rails не работает safely multi-threaded приложение тотально заблокируется.
                                По поводу nginx это удачный выход, но как там upload прогресс мониторить? д
                                  0
                                  rghost.ru на рельсах. Проблем с аплоадом не было :)
                                    0
                                    А какие характиристики - что на front что на backend? Сколько процессов? Жуть как интересно есть ли прогресс мониторинг, проверить сейчас не могу ибо корп.сеттингс запрещают
                                    аплоадинг в интернет. :)
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                        0
                                        сколько то монгрелов + нжинкс
                                  0
                                  Не совсем понимаю почему заминусован пред. коммент?
                                  Ну замените вы аплоадинг на долгоиграющие запросы скажем по генерации капчи, получится тот же ДОС. Я не с целью опорочить рельсы и руби, наоборот, с целью прояснить для себя некоторые моменты, поскольку свое решение в их пользу давно сделал.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      0
                                      Ну генерить капчу с помощью backgroundb это конечно сильно )))
                                      Я им почту отправляю и так, кое какие процессы делаю, но чтобы например на капчу подрядить
                                      это знаете ли перебор :) . Другие альтернативы не вызвали восторга.
                                      Все же как вы nginx файлы аплоадите (и вероятно прогресс закачки) получаете?
                                      По моему альтернативой, так сказать не лабораторной а промышленной будет merb или
                                      camping как раз для аплоада.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          Поясню наверное :)
                                          Чему равен у вас параметр num-procs? Допустим 100
                                          (по вашей же ссылке про монгрил, для примера)
                                          значит на 101 закачке большого файлика первый процесс должен будет убит.
                                          Понимаете? Слишком длинные файлы (ну 100 не много как не крути) будут по
                                          таймауту выноситься как жадные и старые процессы.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              You take it :)
                                              ну в монгриле тоже дело, довольно накладный процесс около 22 метров
                                              каждый сервер. плюс еще имеет тенденцию расти в потреблении памяти.
                                              в целом для загрузки пойдет конечно, но для больших файлов надо однозначно
                                              другое решение.
                                              Кстати размер файла не обязательно больше чем 100 мб, тоже зависит от
                                              ширины канала, как понимаете. Можно и 100 мег быстро загрузить и
                                              уложиться timeout. А проектов грузящих по 100 файлов уйма, тут ведь еще ширина клиентского соединения будет важна, может он с модема отгружает фотку в пару тройку мегабайт?
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  db migration хранит изменения базы данных и возможность откатить их назад. при чём тут меппинг?
                                    0
                                    Фарш невозможно провернуть назад
                                    Друп тэйбл без дампА не восстановишь ;)
                                      0
                                      Есть, конечно, необратимые операции :)
                                      На самом деле можно все миграции выполнить с первой до нужной вам. Но тут вы потеряете данные, которые скорее всего вносили в базу в обход миграций.
                                        0
                                        Имелось ввиду добавление/удаление полей. Вместо alter table в мускуль оно описано прямо в миграции. И не надо alter'ы руками в текстовик сохранять, чтоб потом накатить на рабочий проект.
                                          0
                                          Я в курсе что это, мы используем схожий механизм
                                      0
                                      Тут смысл в том, что переходя к какой-то ревизии SVN, вы получаете дб миграции на тот же момент (миграции хранятся в файлах). Запускаете скрипт rake db:migration, который апдейтит или откатывает назад вашу базу.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          а откатить базу, после откатить код религия не позволяет? :)
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Когда вы выполняете команду rake db:mogration вы можете указать номер нужной вам миграции.
                                        –3
                                        Ну это вам после PHP Ruby on Rails понравился, взгляните лучше на Python с его WSGI, например Werkzeug. Мне вообще Ruby противен, с его неясными языковыми конструкциями...
                                          0
                                          Почему же они неясные? Они наоборот дают некую свободу самовыражения, часто очень сильно облегчая код.
                                            –3
                                            Свобода самовыражения? А потом другому программисту ваш код не прочитать...
                                              0
                                              Не имея за плечами большого опыта программирования на Ruby я могу спокойно читать/понимать чужие исходники. Имея много бОльший опыт программирования на РНР чужой код на РНР читать тяжелее.
                                                0
                                                > спокойно читать/понимать
                                                Смотря кем написан код.
                                                  0
                                                  Ок, при условии что человек не задавался целью написать максимально неудобоваримый код. Ну или если руки совсем... того.
                                                0
                                                а зачем его понимать другому программисту? если вы работаем в комнде (коммиты в SVN/git) то вся комманда придерживается стиля и при необходимости делает ревизию кода... А если я пишу программу для себя... Некий каждодневный tool... Зачем другому программисту вникать в мой, ему не нужный, код? Да и комментраии и документрирование, кстати, никто не отменял....
                                                  0
                                                  Правка опечаток:
                                                  >если вы работаем
                                                  мы
                                                  >комманда
                                                  команда
                                                  >комментраии
                                                  комментарии
                                                  >документрирование
                                                  документирование
                                                    0
                                                    >серию скирнкастов (с нижнего коммента)
                                                    серию скринкастов :)
                                                    Кстати его пипкоды в emule видел.
                                                      0
                                                      о) благодарю) надо мне себя в руках держать и не так быстро печатать)))
                                                      да? хм... Интересно... )
                                                        0
                                                        Довольно таки, целостное изложение, примерно на полчаса-час. Было RJS, prototype,
                                                        caching каэтса. Надо будет еще что нить новенькое поискать. Что мне не очень нравится, что он тот же рестфулл плагин часто в примерах показывает, хотя в нем была и
                                                        есть серьезная уязвимость.
                                                          0
                                                          Я сейчас поискал на просторах Сети... Какие то файлы на 1.5 гига выложены... но за деньгу... Поищу вот в муле сейчас, а потом и в DC...
                                                          А то, что используется... Ну ведь никто не заставляет делать именно так... Можно и что то свое выдумать и найти решение... )
                                                    0
                                                    > а зачем его понимать другому программисту?
                                                    категорически несогласен.
                                                    код пишут для того, чтобы его читал человек и лишь иногда — машина (с) кто-то из великих
                                                    тем не менее, считаю, что с синтаксисом у руби все в порядке.
                                                      0
                                                      С великими спорить не буду) Но я правда не понимаю зачем моя так сказать private программа может понадобится другому)) оттого так и говорю...
                                                      а по синтаксису соглашусь... абсолютно нормален и логичен...
                                                      а запутать то можно не только руби-код, но и любой другой... это уже проблема самих кодеров и их стилистических норм, имхо...
                                                        0
                                                        Согласен :)
                                                        Но вот elsif как то знаете не очень звучит ))
                                                        А вообще на руби два стиля написания: со скобочками и без :)
                                                  0
                                                  Питон и руби как языки очень похожи. Вообще питон быстрый и тоже очень хорош.
                                                    0
                                                    ну это как минимум неправда. конструкции ruby очень даже приятны. частенько приходится делать code-review одного студенческого проекта. никаких затруднений с чтением кода нет. дело привычки, наверное.
                                                    ps: а вообще я программист на python :) так что все объективно.
                                                      0
                                                      да, и кстати, на pyhton я использую фреймворк pylons. там очень многие концепции портированны с рельсов (например url-dispatcher, webhelpers, связка controller-action). при этом фреймворк сохранил все вкусности wsgi.
                                                      в общем питонистам советую если даже не использовать, то хотябы посмотреть.
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                      0
                                                      Это кеширование. Вот скринкасты: http://railscasts.com/ #89 #90 #93
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                          0
                                                          Файлы генерятся фреймворком
                                                      0
                                                      Кстати статья немног устарела. Щас больше юзается map.resources да и рспек вместо рельсовых юнит тестов. Но вообще приятно когда про любимые рельсы пишут :)
                                                        0
                                                        Посоветуйте что нить по рспек для " детей младшего школьного возраста " ?:) Честно пытался начинать тестировать, поняв что уходит до половины времени на это дело решил подождать когда тот же рспек доделают. Его уже не меняют по сто раз на день, стоит изучать?
                                                          0
                                                          Про РСпек... Могу посоветовать серию скирнкастов от PeepCode...
                                                            0
                                                            знаете где взять их бесплатно?
                                                              0
                                                              Пока еще не совсем... А вы?
                                                                0
                                                                а я знаю :) Нуна? =)
                                                                  0
                                                                  Конечно ;-)
                                                                0
                                                                а я знаю :) Нуна? =)
                                                                  0
                                                                  а то
                                                                    0
                                                                    в асю постучался
                                                          0
                                                          когда уже наконец время будет, чтобы попробовать...
                                                            0
                                                            С вашего позволения, размещу ссылку на это сообщение на http://www.trueruby.com/
                                                              +1
                                                              Развитее технологий вообще и Rails в частности постоянно продолжается – печальным следствием этого, является процесс устаревания литературы – особенно печатной.
                                                              Именно это в настоящее время и произошло с Rails – почти все существующая литература морально устарела.
                                                              Упомянутая «Agile Web Development…» хороша всем, кроме одного – она описывает Rails версии 1.2.Х, - в то время как последняя версия Rails 2.0.2
                                                              Rails 2.0.Х достаточно сильно отличается от 1.2.Х – некоторые вещи изменились, стали работать по другому или исчезли вообще.
                                                              Но главное это та новая идеология (не побоюсь этого слова) – RESTful архитектура , на которую теперь опираются Rails – это судя по всему скоро будет важный тренд в разработке ПО вообще . То, что это по большому счету вещь на много более важная, чем какое бы то ни было удобство синтаксиса или легкая работа с Ajax – и то, что кроме Rails эта архитектура не интегрирована так глубоко – и делает Rails уникальным фреймворком.
                                                                0
                                                                Для начинающих Agile Web Development сойдёт. А потом уже можно почитать о новинках в рейлс 2.
                                                                  +1
                                                                  Просто с середины декабря достаточно часто наблюдается ситуация - на форумах эта тема поднимается регулярно - люди которые хотят познакомиться с Rails устанавливают последнюю версию (а это вполне логичное поведение) - пытаются сделать все по книге - но у них не получается, или получается не так как написано. Это в общем не способствует доверию к фреимворку. По этому эту особенность в работе с версиями RoR нужно учитывать.

                                                                  Кроме Agile Web Development - которая конечно книга историческая, есть еще и (даже лучше в некоторых моментах)
                                                                  "Rails Solutions - Ruby on Rails Made Easy" - Williams
                                                                  "Beginning Ruby on Rails E-Commerce" - Hellsten/Laine
                                                                  "Beginning Rails: From Novice to Professional" - Hardy/Carneiro
                                                                  "Build Your Own Ruby On Rails Web Applications" - Lenz

                                                                  Если кто то из читателей топика надумает начать изучать Rails - совет от всего сердца :) - не ограничиваться только "Agile Web Development" а найти какую ни будь из этих 4 книг - они стоят того.
                                                                  0
                                                                  Но начать изучение советую с самого языка руби! Это вам не Си и не РНР. Кое что придётся переосмыслить.
                                                                    0
                                                                    Тем более что сделать это сейчас достаточно легко - когда я впервые узнал о Ruby - по русски не было практически ничего. Теперь же - кроме печатной литературы (которая наконец стала повалятся) - есть в сети несколько очень хороших вводных курсов - раз и два например.
                                                                  +1
                                                                  Кстати, а ведь существует не только RoR. На том же Ruby есть, например, Merb, который немного отличается и может лучше подойти другим программистам. Например, там нет жёсткой привязки к ActiveRecord, которая не является идеальной системой.
                                                                    0
                                                                    Вот вот - а есть еще и Nitro, с альтернативной ActiveRecord ORM - Og (весьма интересной)
                                                                    0
                                                                    Карсас приложения (дело вкуса)
                                                                    Думаю всё же: Карксас приложения???
                                                                    =)
                                                                      0
                                                                      Ах ну да! Спасибо
                                                                      –2
                                                                      Посмотрите еще Python и MVC-фреймворки, сделанные на нем.
                                                                      Rails хороший фреймворк, но для нагруженных проектов, возможно, стоит выбрать что-то на Python.

                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                      Самое читаемое