Rails 3 и SproutCore

Привет! Есть такой замечательный 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 проекта
Альбом видео по сабжу на Вимео


0 комментариев

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