До этого момента в серии Rails Deep Dive мы сосредоточились на том, чтобы копаться в недрах фреймворка, пытаясь раскрыть некоторые способы, которыми Rails выполняет свою магию. В дальнейшем я хочу создать приложение на Rails 3.1, сосредоточившись на том, как настроить приложение, выполнить разработку и развернуть приложение. Я думаю, что серии будет полезно иметь конкретную цель.
Наше приложение будет называться Loccasions . Цель Loccasions — позволить пользователям создавать События и Случаи . Событием может быть «Я убрал свою комнату» или «Шел дождь» или «Наблюдение кометы». События содержат случаи, отмечая время и место, где произошло событие. Приложение представит события на карте, позволяя пользователю увидеть, как часто и где происходит событие. Идея проста и специфична для конкретного случая использования, поэтому создание приложения должно быть несложным (он говорит, зная, что столкнется с препятствиями…)
Пользовательские истории
При создании нового приложения на Rails (или любого другого приложения на самом деле) неплохо было бы иметь несколько пользовательских историй для управления приложением и обеспечения того, чтобы мы оставались в курсе задач. Обычно вы встречаетесь с клиентом и генерируете истории пользователей высокого уровня вместе. Ключ к пользовательским историям — собрать достаточно деталей, чтобы начать работать, избегая «паралича анализа», который может нанести ущерб прогрессу. Для Loccasions мы будем поддерживать пользовательские истории на довольно высоком уровне, добавляя больше по мере продвижения. Наши первые истории:
- Как незарегистрированный пользователь, я хочу видеть домашнюю / целевую страницу
- Как администратор, я хочу иметь возможность приглашать пользователей в Loccasions
- Как приглашенный пользователь, я хочу иметь возможность создать учетную запись
- Как зарегистрированный пользователь, я хочу иметь возможность создавать события
- Как зарегистрированный пользователь, я хочу иметь возможность создавать случаи
- Как зарегистрированный пользователь, я хочу видеть случаи на карте
Я думаю, что это хорошее начало.
Драгоценные камни
Следующее решение касается драгоценных камней, которые мы собираемся использовать, чтобы позаботиться о некоторых наших функциональных потребностях. Очевидно, что Loccasions потребуется какая-то аутентификация, и у сообщества есть отличные жемчужины в этой области. Вероятно, самым известным жемчужиной аутентификации является Devise, написанный Хосе Валимом и невероятными ребятами из Plataformatec. Я думаю, что использование Devise дает нам проверенную жемчужину и фантастическое сообщество для поддержки.
Одно из решений, которые я принял для Loccasions, — это то, как настойчивость будет решаться. Вместо того, чтобы идти по стандартному маршруту реляционной базы данных, как PostGIS или MySQL, я выбрал MongoDB для нашего внутреннего хранилища персистентности. Во-первых, я думаю, что модель Event ==> Occasions делает хорошую модель БД документа. Во-вторых, я относительно уверен, что Loccasions будет использовать пространственную функциональность, которую обеспечивает MongoDB. Кроме того, если честно, я действительно хочу использовать MongoDB в «реалистичном» Rails-приложении, и это — стук возможностей.
Использование MongoDB ведет к другой области, где драгоценные камни могут помочь. В этом случае я посмотрел на MongoMapper и Mongoid и остановился на Mongoid, потому что он, кажется, немного лучше поддерживает пространственные части MongoDB, а также существование mongoid_spacial
Стоит отметить, что этот вывод основан на нескольких минутах просмотра обоих комплектов документов, поэтому он может быть неверным. Однако именно так иногда принимаются решения при запуске приложения. Выберите направление и идите. Кроме того, весьма вероятно, что мы столкнемся с проблемами версий между гем-зависимостями. Если / когда это произойдет, нам, возможно, придется либо пожертвовать драгоценным камнем, либо разорвать его и решить проблему самостоятельно.
Клиентский материал
Я относительно уверен, что мы будем использовать приличное количество JavaScript в Loccasions. Мое первоначальное видение рассматривает каждую страницу событий как одностраничное приложение, позволяющее пользователю создавать события и добавлять их на карту. Карта и список Occasions будут синхронизированы, что означает, что у нас есть два «вида с нашим видом». Это видение подталкивает меня к клиентской среде, и мой текущий фаворит — Backbone.js . Драгоценный камень rails-backbone упрощает использование Backbone с Rails, поэтому мы также добавим этот драгоценный камень в список. (Примечание: есть два драгоценных камня Backbone, которые очень близко названы, убедитесь, что вы используете гем codebrew)
Кроме того, я стал поклонником Haml, поэтому я думаю, что мы будем использовать Haml вместо ERB для наших шаблонов представления.
тестирование
Мы будем, насколько это возможно, использовать тест-ориентированный подход к созданию Loccasions. По сути, это означает, что мы сначала напишем тесты для разработки и реализации приложения. Имея это в виду, нам нужно выбрать подход к тестированию, и я выбрал RSpec и Capybara. Мне нравится RSpec и я думаю, что что-то вроде Cucumber — это немного больше, чем мне нужно для этой серии. Также есть гем, который объединяет Mongoid и Rspec (mongoid-rspec), который упростит наше тестирование.
Подход, основанный на тестировании, распространяется и на клиентскую часть приложения, и использование чего-то вроде Jasmine поддерживает согласованный подход к спецификации.
Управления источником
Я буду создавать репозиторий Github для источника Loccasions. Перед началом любого процесса разработки у вас должен быть план контроля версий. Git упрощает работу с SCM, поэтому нет никаких оправданий.
Другие источники
Один из лучших инструментов в вашем наборе инструментов Rails — это Интернет, стоящий на плечах тех, кто был раньше. Например, мое вдохновение для установки Devise и Mongoid — одно из фантастических руководств Дэниела Кехо. Я уверен, что мы будем искать в Интернете помощь и ресурсы, и я надеюсь подчеркнуть то, что мы находим.
Стартовая линия
Хорошо, я думаю, что достаточно планирования. Пора перестать опускать пальцы ног в воду и прыгать на шею. Конечно, нам нужен MongoDB, работающий локально. Иди установи MongoDB на свою платформу … Я подожду.
Выполнено? Надеюсь, у вас есть готовая установка MongoDB по умолчанию. Последнее, что нужно сделать перед тем, как мы сгенерируем приложение, — это создать github-репозиторий для нашего приложения (мой находится здесь .)
Мы приближаемся. Я использую Rails 3.1 RC5 и Ruby 1.9.2. Кроме того, я использую RVM, и я настоятельно рекомендую вам настроить RVM и гемсет перед продолжением.
rvm use 1.9.2@loccasions -- create # will create and switch to loccasions gemset and Ruby 1.9.2
У нас есть чистый набор гемов, поэтому нам нужно установить пару гемов, прежде чем мы сможем добраться до Rails.
gem install bundler
gem install rails --pre # We want 3.1
Помните, что мы используем MongoDB, поэтому нам не нужны какие-либо части ActiveRecord (-O) (мы не будем использовать миграции). Кроме того, мы используем RSPec, поэтому нет необходимости генерировать файлы Test :: Unit (-T ).
rails new loccasions -O -T
cd loccasions
Теперь, когда у нас наконец есть структура приложения, нам нужно добавить вышеупомянутые жемчужины. Откройте «Gemfile» в вашем любимом редакторе (я использую vim, потому что это фантастично) и сделайте так, чтобы он выглядел так:
source 'http://rubygems.org'
gem 'rails', '3.1.0.rc5'
gem 'devise', "~> 1.4.2"
gem 'mongoid', "~> 2.1.8"
gem 'mongoid_spacial', "~> 0.2.13"
gem 'haml', '~> 3.1.2'
gem 'bson_ext', '~> 1.3.1'
gem 'rails-backbone', "~> 0.5.3"
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', "~> 3.1.0.rc"
gem 'coffee-rails', "~> 3.1.0.rc"
gem 'uglifier'
end
gem 'jquery-rails'
group :test, :development do
gem 'rspec-rails', '~> 2.6.1'
gem 'mongoid-rspec', '~> 1.4.4'
gem 'capybara', '~> 1.0.1'
gem 'factory_girl_rails', '~> 1.1.0'
gem 'database_cleaner', '~> 0.6.7'
gem 'jasmine', '~> 1.0.2.1'
end
Быстрая bundle install
Прежде чем мы это сделаем, давайте сделаем начальный коммит в наш репозиторий git и отправим его в github. Сначала отредактируйте .gitignore и убедитесь, что он имеет смысл:
.bundle
db/*.sqlite3
log/*.log
tmp/
.sass-cache/
*.swp
.DS_Store
Я добавил *.swp
.DS_Store
git add .
git commit -m "Initial commit"
Теперь добавьте ваш удаленный репозиторий GitHub как «origin».
git remote add origin https://ruprict@github.com/ruprict/loccasions.git
git push origin master
В ту минуту, когда я это сделал, я понял, что забыл создать файл .rvmrc, так что давайте сделаем это и подтолкнем его вверх.
rvm --rvmrc --create ruby-1.9.2-p290@loccasions
Теперь cd ..
cd loccasions
Вам будет предложено просмотреть файл, затем введите «да». Наконец, добавьте .rvmrc в git и добавьте его в github.
git add .rvmrc
git commit -m "Added .rvmrc"
git push origin master
В следующем посте серии мы начнем с истории «незарегистрированный пользователь», которая должна привести нас к принятию решения о том, как мы будем макетировать приложение. Дайте мне знать, в комментариях, если у вас есть проблемы или вопросы по поводу установки.