diff options
23 files changed, 264 insertions, 0 deletions
@@ -35,6 +35,7 @@ gem 'spank' gem 'exifr' gem 'aws-sdk' gem 'mime-types' +gem 'rails-backbone' group :development do gem 'capistrano' diff --git a/Gemfile.lock b/Gemfile.lock index 81a3d89b..64f019aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -100,6 +100,7 @@ GEM dotenv-deployment (0.0.2) dotenv-rails (0.11.1) dotenv (= 0.11.1) + ejs (1.0.0) equalizer (0.0.9) erubis (2.7.0) exception_notification (4.0.1) @@ -213,6 +214,10 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 4.0.5) sprockets-rails (~> 2.0.0) + rails-backbone (0.7.2) + coffee-script (~> 2.2.0) + ejs (~> 1.0.0) + railties (>= 3.1.0) railties (4.0.5) actionpack (= 4.0.5) activesupport (= 4.0.5) @@ -353,6 +358,7 @@ DEPENDENCIES pg poltergeist rails (~> 4.0.5) + rails-backbone rmagick (~> 2.13.0) rspec-rails sass-rails (~> 4.0) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 478c48d7..0f80d8ad 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -22,4 +22,9 @@ //= require jquery.embedly //= require tag-it //= require bootstrap +//= require underscore +//= require backbone +//= require backbone_rails_sync +//= require backbone_datalink +//= require backbone/cake //= require_tree . diff --git a/app/assets/javascripts/backbone/cake.js.coffee b/app/assets/javascripts/backbone/cake.js.coffee new file mode 100644 index 00000000..ef65c9b3 --- /dev/null +++ b/app/assets/javascripts/backbone/cake.js.coffee @@ -0,0 +1,14 @@ +#= require_self +#= require_tree ./templates +#= require_tree ./models +#= require_tree ./views +#= require_tree ./routers + +window.Cake = + Models: {} + Collections: {} + Routers: {} + Views: {} + initialize: (data) -> + new Cake.Routers.CakesRouter({ cakes: data.cakes }) + Backbone.history.start() diff --git a/app/assets/javascripts/backbone/models/.gitkeep b/app/assets/javascripts/backbone/models/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/app/assets/javascripts/backbone/models/.gitkeep diff --git a/app/assets/javascripts/backbone/models/cake.js.coffee b/app/assets/javascripts/backbone/models/cake.js.coffee new file mode 100644 index 00000000..c11d1611 --- /dev/null +++ b/app/assets/javascripts/backbone/models/cake.js.coffee @@ -0,0 +1,10 @@ +class Cake.Models.Cake extends Backbone.Model + paramRoot: 'cake' + + defaults: + name: null + story: null + +class Cake.Collections.CakesCollection extends Backbone.Collection + model: Cake.Models.Cake + url: '/cakes' diff --git a/app/assets/javascripts/backbone/routers/.gitkeep b/app/assets/javascripts/backbone/routers/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/app/assets/javascripts/backbone/routers/.gitkeep diff --git a/app/assets/javascripts/backbone/routers/cakes_router.js.coffee b/app/assets/javascripts/backbone/routers/cakes_router.js.coffee new file mode 100644 index 00000000..d852df56 --- /dev/null +++ b/app/assets/javascripts/backbone/routers/cakes_router.js.coffee @@ -0,0 +1,31 @@ +class Cake.Routers.CakesRouter extends Backbone.Router + initialize: (options) -> + @cakes = new Cake.Collections.CakesCollection() + @cakes.reset options.cakes + + routes: + "new" : "newCake" + "index" : "index" + ":id/edit" : "edit" + ":id" : "show" + ".*" : "index" + + newCake: -> + @view = new Cake.Views.Cakes.NewView(collection: @cakes) + $("#cakes").html(@view.render().el) + + index: -> + @view = new Cake.Views.Cakes.IndexView(cakes: @cakes) + $("#cakes").html(@view.render().el) + + show: (id) -> + cake = @cakes.get(id) + + @view = new Cake.Views.Cakes.ShowView(model: cake) + $("#cakes").html(@view.render().el) + + edit: (id) -> + cake = @cakes.get(id) + + @view = new Cake.Views.Cakes.EditView(model: cake) + $("#cakes").html(@view.render().el) diff --git a/app/assets/javascripts/backbone/templates/.gitkeep b/app/assets/javascripts/backbone/templates/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/app/assets/javascripts/backbone/templates/.gitkeep diff --git a/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs new file mode 100644 index 00000000..cd7c8588 --- /dev/null +++ b/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs @@ -0,0 +1,6 @@ +<td><%= name %></td> +<td><%= story %></td> + +<td><a href="#/<%= id %>">Show</td> +<td><a href="#/<%= id %>/edit">Edit</td> +<td><a href="#/<%= id %>/destroy" class="destroy">Destroy</a></td> diff --git a/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs new file mode 100644 index 00000000..a8440447 --- /dev/null +++ b/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs @@ -0,0 +1,20 @@ +<h1>Edit cake</h1> + +<form id="edit-cake" name="cake"> + <div class="field"> + <label for="name"> name:</label> + <input type="text" name="name" id="name" value="<%= name %>" > + </div> + + <div class="field"> + <label for="story"> story:</label> + <input type="text" name="story" id="story" value="<%= story %>" > + </div> + + <div class="actions"> + <input type="submit" value="Update Cake" /> + </div> + +</form> + +<a href="#/index">Back</a>
\ No newline at end of file diff --git a/app/assets/javascripts/backbone/templates/cakes/index.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/index.jst.ejs new file mode 100644 index 00000000..058ff2e2 --- /dev/null +++ b/app/assets/javascripts/backbone/templates/cakes/index.jst.ejs @@ -0,0 +1,15 @@ +<h1>Listing cakes</h1> + +<table id="cakes-table"> + <tr> + <th>Name</th> + <th>Story</th> + <th></th> + <th></th> + <th></th> + </tr> +</table> + +<br/> + +<a href="#/new">New Cake</a> diff --git a/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs new file mode 100644 index 00000000..2f4dbd7f --- /dev/null +++ b/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs @@ -0,0 +1,20 @@ +<h1>New cake</h1> + +<form id="new-cake" name="cake"> + <div class="field"> + <label for="name"> name:</label> + <input type="text" name="name" id="name" value="<%= name %>" > + </div> + + <div class="field"> + <label for="story"> story:</label> + <input type="text" name="story" id="story" value="<%= story %>" > + </div> + + <div class="actions"> + <input type="submit" value="Create Cake" /> + </div> + +</form> + +<a href="#/index">Back</a>
\ No newline at end of file diff --git a/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs new file mode 100644 index 00000000..d24b2aef --- /dev/null +++ b/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs @@ -0,0 +1,12 @@ +<p> + <b>Name:</b> + <%= name %> +</p> + +<p> + <b>Story:</b> + <%= story %> +</p> + + +<a href="#/index">Back</a>
\ No newline at end of file diff --git a/app/assets/javascripts/backbone/views/.gitkeep b/app/assets/javascripts/backbone/views/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/app/assets/javascripts/backbone/views/.gitkeep diff --git a/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee new file mode 100644 index 00000000..3a96f5f7 --- /dev/null +++ b/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee @@ -0,0 +1,19 @@ +Cake.Views.Cakes ||= {} + +class Cake.Views.Cakes.CakeView extends Backbone.View + template: JST["backbone/templates/cakes/cake"] + + events: + "click .destroy" : "destroy" + + tagName: "tr" + + destroy: () -> + @model.destroy() + this.remove() + + return false + + render: -> + $(@el).html(@template(@model.toJSON())) + return this diff --git a/app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee new file mode 100644 index 00000000..b29e8613 --- /dev/null +++ b/app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee @@ -0,0 +1,24 @@ +Cake.Views.Cakes ||= {} + +class Cake.Views.Cakes.EditView extends Backbone.View + template : JST["backbone/templates/cakes/edit"] + + events : + "submit #edit-cake" : "update" + + update : (e) -> + e.preventDefault() + e.stopPropagation() + + @model.save(null, + success : (cake) => + @model = cake + window.location.hash = "/#{@model.id}" + ) + + render : -> + $(@el).html(@template(@model.toJSON() )) + + this.$("form").backboneLink(@model) + + return this diff --git a/app/assets/javascripts/backbone/views/cakes/index_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/index_view.js.coffee new file mode 100644 index 00000000..0d67fc63 --- /dev/null +++ b/app/assets/javascripts/backbone/views/cakes/index_view.js.coffee @@ -0,0 +1,20 @@ +Cake.Views.Cakes ||= {} + +class Cake.Views.Cakes.IndexView extends Backbone.View + template: JST["backbone/templates/cakes/index"] + + initialize: () -> + @options.cakes.bind('reset', @addAll) + + addAll: () => + @options.cakes.each(@addOne) + + addOne: (cake) => + view = new Cake.Views.Cakes.CakeView({model : cake}) + @$("tbody").append(view.render().el) + + render: => + $(@el).html(@template(cakes: @options.cakes.toJSON() )) + @addAll() + + return this diff --git a/app/assets/javascripts/backbone/views/cakes/new_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/new_view.js.coffee new file mode 100644 index 00000000..e43f7f31 --- /dev/null +++ b/app/assets/javascripts/backbone/views/cakes/new_view.js.coffee @@ -0,0 +1,37 @@ +Cake.Views.Cakes ||= {} + +class Cake.Views.Cakes.NewView extends Backbone.View + template: JST["backbone/templates/cakes/new"] + + events: + "submit #new-cake": "save" + + constructor: (options) -> + super(options) + @model = new @collection.model() + + @model.bind("change:errors", () => + this.render() + ) + + save: (e) -> + e.preventDefault() + e.stopPropagation() + + @model.unset("errors") + + @collection.create(@model.toJSON(), + success: (cake) => + @model = cake + window.location.hash = "/#{@model.id}" + + error: (cake, jqXHR) => + @model.set({errors: $.parseJSON(jqXHR.responseText)}) + ) + + render: -> + $(@el).html(@template(@model.toJSON() )) + + this.$("form").backboneLink(@model) + + return this diff --git a/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee new file mode 100644 index 00000000..a8c4063d --- /dev/null +++ b/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee @@ -0,0 +1,8 @@ +Cake.Views.Cakes ||= {} + +class Cake.Views.Cakes.ShowView extends Backbone.View + template: JST["backbone/templates/cakes/show"] + + render: -> + $(@el).html(@template(@model.toJSON() )) + return this diff --git a/app/controllers/cakes_controller.rb b/app/controllers/cakes_controller.rb new file mode 100644 index 00000000..1987c8da --- /dev/null +++ b/app/controllers/cakes_controller.rb @@ -0,0 +1,7 @@ +class CakesController < ApplicationController + respond_to :html, :json + + def index + respond_with(@cakes = Creation.all.limit(10)) + end +end diff --git a/app/views/cakes/index.html.erb b/app/views/cakes/index.html.erb new file mode 100644 index 00000000..0f750d7e --- /dev/null +++ b/app/views/cakes/index.html.erb @@ -0,0 +1,8 @@ +<%= content_for :javascript do -%> + <%= javascript_tag do %> + Cake.initialize({ cakes: <%== @cakes.to_json %> }); + <% end %> +<% end -%> + +<div id="cakes"> +</div> diff --git a/config/routes.rb b/config/routes.rb index c2182851..58c2ea00 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,6 +18,7 @@ Cake::Application.routes.draw do resources :favorites, :only => [:index, :create] get 'page/:page', :action => :index, :on => :collection end + resources :cakes resources :profiles, :only => [:index, :show] do get 'page/:page', :action => :index, :on => :collection |
