Обновить

Rails 3 и SproutCore

Ruby on Rails *
Из песочницы
Привет! Есть такой замечательный 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, это не так сложно — нужно предоставить правильные данные в формате JSON. В мануале предлагается написать громоздкий класс, но в комментариях подсказали более правильное решение.
Итак, изменим наш 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 проекта
Альбом видео по сабжу на Вимео
Теги:
Хабы:
Всего голосов 31: ↑28 и ↓3 +25
Просмотры 1.1K
Комментарии Комментарии 18

Минуточку внимания

Работа

Ruby on Rails
46 вакансий