Skip to content

Instantly share code, notes, and snippets.

@marocchino
Created August 7, 2012 08:06
Show Gist options
  • Save marocchino/3282977 to your computer and use it in GitHub Desktop.
Save marocchino/3282977 to your computer and use it in GitHub Desktop.
emberjs + rails3.2 handson
rails new ember -d postgresql
echo "gem 'emberjs-rails'" >> Gemfile
bundle
rails g scaffold todo title done:boolean
rake db:create:all
rake db:migrate

application.js にemberを追加

//= require jquery
//= require jquery_ujs
//= require ember
//= require_tree .

app/views/todos/index.html.erbにコード追加

<hr />

<script type="text/x-handlebars" charset="utf-8">
  {{view Em.TextField id="new-todo" placeholder="仕事を入力"}}
</script>

サーバを立ち上げましょう。 ブラウザのデーバグツールでElement確認

実際のControllerをつけてみましょう。

<script type="text/x-handlebars" charset="utf-8">
  {{view Todos.CreateTodoView id="new-todo" placeholder="仕事を入力"}}
</script>

app/assets/javascripts/todos.js.coffeeに次のコードを追加

Todos = Ember.Application.create()

window.Todos = Todos

Todos.CreateTodoView = Em.TextField.extend
  insertNewline: ->
    value = @get('value')
    alert(value)

ここでブラウザに行けば入力した内容がAlertで出るのを確認できます。

app/assets/javascripts/todos.js.coffeeを修正

Todos.todosController = Em.ArrayProxy.create
  content: []
  createTodo: (title) ->
    todo = Todos.Todo.create(title: title)
    @pushObject(todo)

Todos.CreateTodoView = Em.TextField.extend
  insertNewline: ->
    value = @get('value')
    if value
      Todos.todosController.createTodo(value)
      @set('value','')

TextFieldに適度に入力してデーバクコンソルから確認

Todos.todosController.content

Objectが更新されるのを確認できます。 画面で更新内容を見るためには…

  {{#collection contentBinding="Todos.todosController" tagName="ul" itemClassBinding="content.isDone"}}
    {{view Em.Checkbox titleBinding="content.title"}}
  {{/collection}} 

そこで、ServerとDataを連動するにはどうすれば?

application.jsember-data を追加

//= require ember-data

モデルを変更

Todos.Todo = DS.Model.extend
  title: DS.attr 'string'
  isDone: DS.attr 'boolean'
Todos.Todo.reopenClass
  url: "todo"

Todos.store = DS.Store.create
  adapter: DS.RESTAdapter.create
    bulkCommit: false
  revision: 4

コントローラーも変更

Todos.todosController = Em.ArrayProxy.create
  content: Todos.store.findAll(Todos.Todo)
  createTodo: (title) ->
    Todos.store.createRecord(Todos.Todo, title: title)
    Todos.store.commit()

元ならゴレで動くはずですが、RailsのJSONがEmberの奴と模様が違うので上手くいかないです。

ここは強気で

gem 設置

gem 'active_model_serializers'

Railsのモデルを変更します。

class TodoSerializer < ActiveModel::Serializer
  attributes :id, :done, :title
end

class Todo < ActiveRecord::Base
  attr_accessible :done, :title
end

ここでブらウザで確認してみましょう 'ㅅ'/

Ref

rails new ember -d postgresql
echo "gem 'emberjs-rails'" >> Gemfile
bundle
rails g scaffold todo title done:boolean
rake db:create:all
rake db:migrate

application.js 에 엠버추가

//= require jquery
//= require jquery_ujs
//= require ember
//= require_tree .

app/views/todos/index.html.erb에 추가

<hr />

<script type="text/x-handlebars" charset="utf-8">
  {{view Em.TextField id="new-todo" placeholder="뭘해야하는데?"}}
</script>

서버를 켜봅시다. 인스팩터로 만들어진 엘리먼트를 확인

이제 실제 컨트롤러에 붙여 봅시다.

<script type="text/x-handlebars" charset="utf-8">
  {{view Todos.CreateTodoView id="new-todo" placeholder="뭘해야하는데?"}}
</script>

app/assets/javascripts/todos.js.coffee에 다음코드를 작성

Todos = Ember.Application.create()

window.Todos = Todos

Todos.CreateTodoView = Em.TextField.extend
  insertNewline: ->
    value = @get('value')
    alert(value)

이제 브라우저로 가보면 입력한 내용이 얼렛으로 나오는걸 확인 할 수 있습니다.

app/assets/javascripts/todos.js.coffee를 수정

Todos.todosController = Em.ArrayProxy.create
  content: []
  createTodo: (title) ->
    todo = Todos.Todo.create(title: title)
    @pushObject(todo)

Todos.CreateTodoView = Em.TextField.extend
  insertNewline: ->
    value = @get('value')
    if value
      Todos.todosController.createTodo(value)
      @set('value','')

입력창에 아무거나 입력해 본 다음에 콘솔을 열어서

Todos.todosController.content

오브젝트가 있는걸 확인했으면 핸들바 구문에 다음내용을 추가하면 데이터가 쌓이는걸 트래킹 할수있음.

  {{#collection contentBinding="Todos.todosController" tagName="ul" itemClassBinding="content.isDone"}}
    {{view Em.Checkbox titleBinding="content.title"}}
  {{/collection}} 

하지만 서버사이드와 데이터를 연동하려면 어떻게 해야할까?

application.jsember-data 를 추가

//= require ember-data

모델을 변경

Todos.Todo = DS.Model.extend
  title: DS.attr 'string'
  isDone: DS.attr 'boolean'
Todos.Todo.reopenClass
  url: "todo"

Todos.store = DS.Store.create
  adapter: DS.RESTAdapter.create
    bulkCommit: false
  revision: 4

컨트롤러를 변경

Todos.todosController = Em.ArrayProxy.create
  content: Todos.store.findAll(Todos.Todo)
  createTodo: (title) ->
    Todos.store.createRecord(Todos.Todo, title: title)
    Todos.store.commit()

일단 이걸로 움직여야 하지만 레일즈의 json형식이 엠버에서 원하는 모양과 달라서 재대로 안나올겁니다.

여기는 강행 돌파

gem 설치

gem 'active_model_serializers'

레일즈의 모델을 변경합니다

class TodoSerializer < ActiveModel::Serializer
  attributes :id, :done, :title
end

class Todo < ActiveRecord::Base
  attr_accessible :done, :title
end

이제 브라우져에서 확인해봅시다 'ㅅ'/

Ref

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment