Rails 3 и SproutCore

25 марта 2011 г.

Привет! Есть такой замечательный JavaScript фреймворк под названием SproutCore. С помощью него можно довольно легко писать веб-приложения с приближенным к десктопному интерфейсом. Штука довольно популярная, используется например Apple в iWork.com. Под катом мы прикрутим SproutCore к последним рельсам.

Само собой, сначала поставим гем с SproutCore:
sudo gem install sproutcore

К слову говоря, версия RubyGems должна быть не ниже 1.2, иначе ничего не получится. Но обновиться достаточно легко:
sudo gem update --system

Ок, будем считать, что гем у нас стоит. Попробовать SproutCore в принципе можно уже сейчас:
sc-init hello_sp
cd hello_sp
sc-server

После чего заходим на localhost:4020 и смотрим результат. Но мы займемся прикручиванием всей этой радости к рельсам.
На официальном сайте приводится пример с todo RESTful приложением, так что не будем ничего выдумывать и повторим:

Создаем проект:
$ rails new todos
$ cd todos

Дальше нам нужно создать и чем-то наполнить БД, плюс редактирование этих данных через веб интерфейс. Scaffolding не самое лучшее решение, но для быстрого тестирования подойдет:
rails g scaffold Task description:string isDone:boolean order:integer

Применяем миграции:
rake db:migrate

Дальше нам требуется немножко поработать над реализацией стандартных CRUD операций, приведите app/controllers/tasks_controllers.rb в следующий вид:
class TasksController < ApplicationController
respond_to :json

def index
respond_with(@tasks = Task.all)
end

def show
respond_with(@task = Task.find(params[:id]))
end

def create
respond_with(@task = Task.create(:description => params[:description],
:isDone => params[:isDone],
:order => params[:order]))
end

def update
@task = Task.find(params[:id])
@task.description = params[:description]
@task.isDone = params[:isDone]
@task.order = params[:order]
@task.save
respond_with(@task)
end

def destroy
@task = Task.find(params[:id])
@task.destroy
render(:nothing => true, :status => :ok)
end
end

Отлично, следующий шаг — заполнить чем-то базу данных. Вариантов много, один из наиболее удобных — заполнить db/seeds.rb:
Task.create(:description => 'This is the first task', :isDone => true, :order => 1)
Task.create(:description => 'This is the second task', :isDone => false, :order => 2)
Task.create(:description => 'This is the third task', :isDone => true, :order => 3)

Хотя (если значений немного), прямо в консоли вбить тоже можно: rails c и вперед. Далее заполняем нашу БД:
rake db:seed

Все почти готово для теста rails приложения, осталось удалить protect_from_forgery из ApplicationController, иначе может возникнуть страшная ошибка «InvalidAuthenticityToken error».

Старт:
rails s

По этой ссылке вы должны наблюдать текст с содержимым вашей БД.

Осталось добавить в проект немного SproutCore, это не так сложно.
Дело в том, что SproutCore ожидает данные в формате JSON, это отличается от того, что генерирует RoR. Для исправления этого недостатка в мануале предлагается написать громоздкий класс, но в комментариях подсказали более правильное решение.
Итак, изменим наш ActiveRecord::Base в проекте, он должен выглядеть примерно так:
class Task < ActiveRecord::Base
def as_json(options = {})
ret = {
:guid => "/tasks/#{self.id}",
:id => self.id,
:description => self.description,
:isDone => self.isDone
}
end
end

Соответственно, использовать можно к примеру так: store.loadRecords(Todos.Task, response.get('body'));

Осталось добавить строчку в файл buildfile нашего проекта:
proxy "/tasks", :to => "localhost:3000"

На этом пока все. Документации и статей по SproutCore к сожалению не так уж много, но фреймворк явно заслуживает внимания.

Сайт проекта
Демо интерфейса и еще
Wiki проекта
Альбом видео по сабжу на Вимео

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики