пʼятниця, 23 квітня 2010 р.

Meet Padrino! Part 1

Днями по гарячих слідах Sinatra 1.0 вийшов офіційний реліз Padrino. Цю статтю я почав писати відразу після виходу версії 0.9.9 (2 квітня), але з технічних причин зумів довести її до кінця тільки після виходу 0.9.10 (22 квітня).

Padrino - це ще один веб-фреймворк, написаний на мові Ruby. Padrino намагається зробити розробку додатків більш простою і елегантною настільки наскільки це можливо, шляхом розширенням функціональності Sinatra (додаючи помічники, генератори, інтерфейс адміністратора, інтернаціоналізацію), зберігаючи його дух.
Я вже писав декілька статей про Sinatra, думаю їх буде корисно почитати.

Отже, зустрічайте – Padrino!

Ось перелік основних можливостей Padrino:
  • Агностичність. Ви самі вибираєте бібліотеку ORM(ActiveRecord, DataMapper або Sequel), фреймворк тестів(shoulda, rspec), мову шаблонів(HAML, Erb), бібліотеку JavaScript(JQuery, Prototype).
  • Генератори. Створення додатку, моделей, контролерів. За допомогою команди padrino-gen project.
  • Монтування. Головним чином призначене для простої установки декількох додатків в рамках одного проекту, на відміну від інших Ruby-фреймворків.
  • Маршрутизація. Іменовані URL-маршрути, іменовані параметри, підтримка respont_to, підтримка фільтрів before/after.
  • Помічники (helpers)
    • Помічники тегів: tag, content_tag, input_tag.
    • Помічники тверджень: link_to, image_tag, javascript_include_tag.
    • Помічники форм: form_tag, form_for, field_set_tag, text_field.
    • Текстові помічники. Корисні для форматування: relative_time_ago, js_escape_html, sanitize_html
  • Підтримка створення, отримання і доставки електронної пошти (аналог ActionMailer з Rails).
  • Інтерфейс адміністратора (як в Django).
  • Протоколювання. Забезпечення єдиного реєстратора, який може взаємодіяти з ORM або будь-якою іншою бібліотекою.
  • Перезавантаження. Автоматичне перезавантаження сервера коду в процесі розробки.
  • Інтернаціоналізація. Повна підтримка I18n.

Почнемо наше знайомство зі встановлення Padrino:
$ sudo gem1.9.1 install padrino

Під час написання цієї статті я використовував Ubuntu Linux і Ruby версії 1.9.1 зібрану із вихідних кодів. Всі приклади я буду приводити для терміналу.

Тепер все готово, щоб розпочати новий проект. Як і в Rails, проект на Padrino починається зі створення скелета.
Для цього прикладу ми будемо використовувати ORM DataMapper, мову розмітки HAML, фреймворк для тестування Shoulda і бібліотеку JavaScript фреймворк jQuery.
$ /opt/ruby191/bin/padrino-gen project sample_blog -t shoulda -e haml -c sass -s jquery -d datamapper -b

Для того щоб переглянути доступні опції, виконайте в терміналі:
$ /opt/ruby191/bin/padrino-gen project -h

Доступні компоненти та їх значення по замовчуванню наведені нижче:
Компонент Опція командного рядка По замовчуванню Доступні значення
Система веб-шаблонів -e haml erb, haml
Інструмент тестування -t rspec bacon, shoulda, cucumber, testspec, riot, rspec
ORM -d - mongomapper, mongoid, activerecord, datamapper, sequel, couchrest
Cтилі CSS (stylesheet) -c - less, sass
JavaScript фреймворк -s - prototype, rightjs, jquery, mootools
Mock-об’єкт -m - rr, mocha

Ця команда створить наш основний проект на Padrino, і надрукує звіт про згенеровані файли. Прапорець -b вказує автоматично встановити всі залежності.
Розглянемо файлову структуру нашого проекту.
  • app/ - тут буде міститись основний код: моделі, шаблони, контролери і помічники
  • config/ - налаштування додатку: параметри з'єднання з БД і підключені додатки до проекту
  • lib/ - тут можна розмістити код сторонніх бібліотек
  • public/ - кореневий каталог веб-сервера, тут лежить статичний контент
  • test/ - тести
  • tmp/ - тут по замовчуванню зберігаються сесії користувача і pid-файли

Слідуємо інструкції, яку надав генератор. Переходимо у каталог з новоствореним проектом
$ cd sample_blog
і виконуємо наступну команду:
$ /opt/ruby191/bin/bundle install
Ця команда встановить відсутні бібліотеки.

Bundler - це менеджер для управління залежностями gem'ів в Ruby-додатках. Ця утиліта дозволяє легко встановлювати необхідні gem'и для вашої програми, при цьому зовсім не залежати від встановлених в системі.

Тепер подивимось на файл config/database.rb, щоб переконатися, що підключення до бази даних є коректними. Оскільки в цій статті ми будемо використовувати SQLite3, залишимо налаштування по замовчуванню. Якщо на попередньому кроці у вас виникли проблеми з bundle install, можливо в вашій системі не встановлений пакет для розробки sqlite3, який є необхідним для компіляції do_sqlite3.
$ sudo apt-get install libsqlite3-dev

Встановимо кілька простих маршрутів у наш додаток, щоб продемонструвати систему маршрутизації Padrino. Відкриваємош app/app.rb і додаємо наступні маршрути:
# app/app.rb
class SampleBlog < Padrino::Application
  configure do
    # ...
  end

  get "/" do
    "Hello World!"
  end

  get :about, :map => '/about_us' do
    render :haml "%p This is a sample blog created to demonstrate the power of Padrino!"
  end

end

Самий час запустити веб-сервер і переконатися, що додаток працює.
$ /opt/ruby191/bin/padrino start
=> Located unlocked Gemfile for development
=> Padrino/0.9.10 has taken the stage development on port 3000
>> Thin web server (v1.2.7 codename No Hup)
>> Maximum connections set to 1024
>> Listening on localhost:3000, CTRL+C to stop

http://localhost:3000
Відкриваємо це посилання у своєму улюбленому браузері і спостерігаємо сторінку "Hello World!"  — значить все гаразд і прийшов час писати додаток.


Панель керування адміністратора

Далі, гарний час для встановлення інтерфейсу адміністратора Padrino, який дозволяє легко переглядати, шукати, змінювати дані для проекту. Вводимо в терміналі:
$ /opt/ruby191/bin/padrino-gen admin

Це створить додаток адміністратора в рамках нашого проекту і встановить його в config/app.rb.
Далі, дотримуючить інструкції, створюємо базу даних, виконуємо міграції і запускаємо завдання, які було сформовано у файлі db/seeds.rb. Переходимо в термінал і виконуєм наступну команду:
& /opt/ruby191/bin/padrino rake dm:migrate seed

В ході цього процесу вам буде запропоновано ввести адресу електронної пошти та пароль для доступу до інтерфейсу адміністратора.

Перезапускаємо веб-сервер і за адресою http://localhost:3000/admin спостерігаємо панель адміністратора.

Створення повідомлень

Тепер коли додаток готовий, давайте створимо функціональність для перегляду повідомлень нашого блогу і додамо можливість створювати нові повідомлення.
Ми це зробимо шляхом створення моделі.
$ /opt/ruby191/bin/padrino-gen model post title:string body:text
=> Located unlocked Gemfile for development
       apply  orms/datamapper
       apply  tests/shoulda
      create  app/models/post.rb
      create  test/models/post_test.rb
      create  db/migrate/002_create_posts.rb

Йдемо далі і виконуємо міграцію.
$ /opt/ruby191/bin/padrino rake dm:migrate

Далі давайте створимо контролер, щоб дозволити основну функціональність для представлень.
$ /opt/ruby191/bin/padrino-gen controller posts get:index get:show
=> Located unlocked Gemfile for development
      create  app/controllers/posts.rb
      create  app/helpers/posts_helper.rb
      create  app/views/posts
       apply  tests/shoulda
      create  test/controllers/posts_controller_test.rb

Прикріпимо деякі стандартні маршрути(:index та :show) до контролера. Якщо ви знайомі з Rails, для вас це буде схожим.
# app/controllers/posts.rb
SampleBlog.controllers :posts do
  get :index do
    @posts = Post.all
    render 'posts/index'
  end

  get :show do
    @post = Post.first(params[:id])
    render 'posts/show'
  end

end

Представлення

Далі створимо представлення для контролера.
# app/views/posts/index.haml
- @title = "Ласкаво просимо"
#posts= partial 'posts/post', :collection => @posts

# app/views/posts/_post.haml
.post
  .title= link_to post.title, url_for(:posts, :show, :id => post.id)
  .body= simple_format(post.body)

# app/views/posts/show.haml
- @title = @post.title
#show
  .post
    .title= @post.title
    .body= simple_format(@post.body)
%p= link_to 'Дивитись всі записи', url_for(:posts, :index)

Інтерфейс адміністратора Pardino дозволяє легко створювати, редагувати і видаляти записи автоматично. Щоб керувати записами з його допомогою необхідно виконати наступну команду:
$ /opt/ruby191/bin/padrino-gen admin_page post
=> Located unlocked Gemfile for development
   create  admin/controllers/posts.rb
   create  admin/views/posts/_form.haml
   create  admin/views/posts/edit.haml
   create  admin/views/posts/index.haml
   create  admin/views/posts/new.haml
   inject  admin/app.rb

Перезапускаємо сервер і дивимося на те, що у нас вийшло.
Відкриваємо у переглядачі http://localhost:3000/admin і входимо використовуючи облікові дані які ми вводили під час встановлення.
Там тепер повинні бути дві вкладки, одна для повідомлень(Posts), а інша для облікових записів(Accounts). Створюємо кілька нових повідомлень.

Головна сторінка нашого блогу матиме наступний вигляд.

Посилання


Продовження...

Немає коментарів: