Когда-то я пробовал Ruby on Rails для веб-разработки, но меня отвлекла сильная зависимость от Active Record и генерации кода. Использование пустых моделей, которые генерировали все их поля из базы данных, не было для меня действительно чистым решением.
У меня также было более закрытое мышление, но после того, как я попробовал много новых языков программирования и увидел презентацию Java viene da Marte, Ruby da Venere (Java приходит с Марса, Ruby из Венеры) Паоло Перротта, я готов попробовать снова ,
Давайте посмотрим, как работает Rails 3: я не буду использовать большинство функций, представленных в версии 3.x, так как начинаю с базовых проблем. Я имею в виду сравнение с PHP-фреймворками, а не с PHP как с чистым языком.
Установка
Rails может быть установлен через gem : он эквивалентен PEAR и требует общесистемных разрешений. Но это только один из вариантов, так как Rails можно загрузить как отдельный пакет.
В Рельсах утилит командной строки позволяет создать новый проект, функцию , которая была скопирована в ОГНЕ Cli инструмент Zend Framework в версии 1.8. Он также имеет небольшой встроенный веб-сервер для запуска проекта в процессе разработки: этот сервер присутствует во многих средах (например, в случае Java, Jetty может быть встроен в рамки) и был скопирован в PHP 5.4.
Примечание для пользователей Ubuntu: в последней версии дистрибутива есть некоторые проблемы с Rails, которые можно исправить . Это вина Ubuntu, а не Rails.
«Rails — это самоуверенное программное обеспечение».
Rails исповедует некоторые основные принципы проектирования:
- Не повторяйся : хорошо для меня. Это нормально и ожидается от решения, ориентированного на разработчиков.
- Соглашение о конфигурации : иногда это сбивает с толку, но это лучше, чем гигантские XML-файлы для отображения полей в столбцах и маршрутов к действиям.
- REST и стандартные HTTP-глаголы, реализованные во многих ресурсах: этот выбор приводит к стандартному списку действий для контроллеров, что в некотором роде помогает ограничить объем кода, который может быть помещен в них.
Привет Мир
Генерация лежит в основе подхода Rails к проблеме Hello World: rails new helloworld создаст новый проект в папке helloworld /. Будет сгенерировано 1186 строк кода (на самом деле 300 — это файл README ). Это немного много, но в наши дни это так для каждой платформы.
Автоматизация используется не только с утилитой rails, но и с rake : это инструмент, эквивалентный Make, Ant или Phing, и он включает сценарии для управления базой данных, выполнения тестов, создания документации и так далее.
После генерации контроллера и представления число строк кода возрастает до 1228. Чтобы завершить пример hello world, я отредактировал app / views / home / index.html.erb и файл маршрутов в config / rout.rb: это стандартная конфигурация MVC на каждом языке, также подразумевающая автоматическую визуализацию нужного шаблона.
Теперь мы в порядке! На самом деле нет: я получил 500 Внутренняя ошибка сервера.
После поиска ошибки, обнаруженной Rails, я сразу же нашел эту страницу справки , которая предлагает удалить закомментированную строку в application.js.
Теперь, как закомментированная строка кода в автоматически сгенерированном файле может нарушить работу совершенно нового приложения, для меня загадка. Всегда помните: фреймворки (PHP, Ruby или Java) содержат гораздо больше движущихся частей, чем могут сломать, чем обычное приложение.
Леса на примере блога
Пример из документации о простом движке блога.
rails generate scaffold Post name:string title:string content:text
сгенерирует модель для объектов Post и вспомогательного кода в других слоях. Всего строк кода будет около 2000: заимствованный дизайн не приходит бесплатно. Rails генерирует даже файлы миграции. Но также фундаментальные вещи: модель, ее контроллер и представления для каждого действия, состоящего из формы и нескольких других для представления.
Сгенерированные контроллеры уважают принципы REST: например, они принимают GET и POST для / posts, GET, PUT или DELETE для / posts / 1.
Формы отображаются в виде шаблонов: этот выбор отличается от выбора в PHP-фреймворках, которые рассматривают их как объекты, которые могут отображать и проверять входящие запросы.
Имейте в виду, что строительные леса предназначены для быстрого создания пользовательского интерфейса , а не в качестве окончательного решения. Между прочим, сгенерированные представления делегируют большое количество помощников представления, поэтому большая часть логики держится подальше от них и от сгенерированного кода (это может быть только хорошо.) Например:
- генерация ссылки на страницу всегда оборачивается помощником вида ( link_to ).
- Form_for помощник позволяет записать форму с разметкой; однако форма динамически заполняется данными из объекта Model или остается пустой в случае нового объекта.
Тем не менее, решение в значительной степени ориентировано на Active Record. Однако есть альтернативы: прошло уже несколько лет, как DataMapper можно было использовать с Rails.
class Post include DataMapper::Resource property :name, Serial property :title, String property :content, Text end
Однако DataMapper не является настоящим Data Mapper (пока). Вы по-прежнему будете вызывать post.save, смешивая ответственность за постоянство с бизнес-логикой, которую вы можете добавить в класс модели. Возможно, шаблон Data Mapper не очень хорошо подходит для модели Ruby, объединяющей объекты из множества маленьких черт; однако, пока класс модели зависит от ORM, это не чистый шаблон Data Mapper.
Способен ли подход поколения развиваться?
На самом деле, эволюция тогда не основана на регенерации кода, так как представления и контроллеры достаточно кратки, чтобы их можно было редактировать вручную (таким образом, генерация — единовременная вещь).
В качестве примера я решил добавить новое поле подписи в модель Post:
- Я добавил его в db / schema.rb и заново сгенерировал базу данных (конечно, можно сделать и с миграциями.) Мне нравится, что конфигурация указана с кодом Ruby: язык программирования выразителен, но лаконичен, что позволяет вставлять случайные сложные поведение; это избавляет от синтаксических ошибок и загадочных сообщений об ошибках, полученных из файлов INI и XML.
- Я добавил поле в app / views / posts / _form.html.erb как новый элемент формы (4 строки разметки).
- Я добавил это поле в представления, например show , где я хотел их отобразить.
Выводы
Я определенно углублюсь в Rails: хорошо рассмотреть различные фреймворки, и, похоже, он быстро сможет разрабатывать прототипы или приложения, привязанные к базе данных. Он также основан на Ruby вместо PHP, поэтому он позволяет мне изучать новый язык в веб-настройке.
Мне также любопытно заняться реальными проблемами веб-приложений: редактирование нескольких связанных сущностей, аутентификация и авторизация, i18n, проверка и фильтрация ввода, тестирование …