Commit d20c0579

mo khan <mo@mokhan.ca>
2014-06-17 02:54:52
create a new cake with backbone.
1 parent 3f5431c
Changed files (9)
app
assets
controllers
models
views
config
app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs
@@ -1,7 +1,9 @@
 <div class="span4">
   <div class="thumbnail">
     <a href="#/<%= id %>">
+    <% if(_.any(photos)) { %>
       <img src="<%= photos[0].large_url %>" />
+    <% } %>
     </a>
     <div class="caption">
       <h3><a href="#/<%= id %>"><%= name %></a></h3>
app/assets/javascripts/backbone/templates/cakes/new.jst.ejs
@@ -1,47 +1,48 @@
 <div class="row">
   <div class="span12">
-    <h1>Share creation <small>(Step 1 of 2)</small></h1>
+    <h1>Share cake <small>(Step 1 of 2)</small></h1>
     <hr />
-    <form id="new-cake" name="cake">
+    <form id="new-cake" name="cake" class="form-horizontal">
       <fieldset>
         <div class="control-group">
-          <label class="control-label" for="name" />
+          <label class="control-label" for="cake_name">Name</label>
           <div class="controls">
-            <input type="text" name="name" id="name" value="<%= name %>" class="input-xxlarge" />
+            <input class="input-xxlarge" id="cake_name" name="name" type="text">
           </div>
         </div>
         <div class="control-group">
-          <label class="control-label" for="watermark" />
+          <label class="control-label" for="cake_watermark">Watermark</label>
           <div class="controls">
-            <input type="text" name="watermark" id="watermark" value="<%= watermark %>" class="input-xxlarge" max='30' />
+            <input class="input-xlarge" id="cake_watermark" maxlength="30" name="watermark" size="30" type="text"> on CakeSide.com
             <a class="tooltip-item" data-placement="right" rel="tooltip" href="#" data-original-title="Watermark your name or company on each uploaded image" data-animation="true"><i class="icon-question-sign"></i></a>
           </div>
         </div>
         <div class="control-group">
-          <label class="control-label" for="story" />
+          <label class="control-label" for="cake_story">Description</label>
           <div class="controls">
-            <textarea id="story" name="story" class="input=xxlarge" rows="3">
-            </textarea>
+            <textarea class="input-xxlarge" id="cake_story" name="story" rows="3"></textarea>
           </div>
         </div>
         <div class="control-group">
           <label class="control-label">Category</label>
           <div class="controls">
-            <select>
-            <option>Cake</option>
-            </select>
+            <select id="cake_category_id" name="category_id"><option value="15">Cake</option>
+            <option value="12">Cake Pop</option>
+            <option value="13">Cookie</option>
+            <option value="3">Cup Cake</option>
+            <option value="16">Other</option></select>
           </div>
         </div>
         <div class="control-group">
-          <label for="tags" class="control-label">Tags</label>
+          <label for="cake_tags" class="control-label">Tags</label>
           <div class="controls">
-            <input name="creation_tags" type="text" id="tags" value="" class="input-xxlarge" autocomplete="off" />
+            <input name="cake_tags" type="text" id="cake_tags" value="" class="input-xxlarge" autocomplete="off" />
           </div>
         </div>
         <div class="control-group">
           <div class="controls">
             <label class="checkbox">
-              <input type="checkbox" name="is_restricted" id="is_restricted" class="input-xxlarge" />
+              <input name="is_restricted" type="hidden" value="0"><input class="input-xxlarge" id="cake_is_restricted" type="checkbox" value="1">
               This cake is for adults only.
             </label>
           </div>
app/assets/javascripts/backbone/templates/cakes/show.jst.ejs
@@ -2,7 +2,9 @@
 
 <div class="row">
   <div class="span6">
+    <% if(_.any(photos)) { %>
     <img class="thumbnail" src="<%= photos[0].large_url %>" alt="<%= name %>" />
+    <% } %>
   </div>
   <div class="span6">
     <h1><a href="#/<%= id %>"><%= name %></a></h1>
app/assets/javascripts/backbone/views/cakes/new_view.js.coffee
@@ -26,11 +26,15 @@ class Cake.Views.Cakes.NewView extends Backbone.View
         window.location.hash = "/#{@model.id}"
 
       error: (cake, jqXHR) =>
-        @model.set({errors: $.parseJSON(jqXHR.responseText)})
+        #@model.set({errors: $.parseJSON(jqXHR.responseText)})
+        error = new Cake.Views.ErrorView
+          el: @$('form#new-cake'),
+          attributesWithErrors: $.parseJSON(jqXHR.responseText)
+        error.render()
     )
 
   render: ->
-    $(@el).html(@template(@model.toJSON() ))
+    $(@el).html(@template(@model.toJSON()))
 
     this.$("form").backboneLink(@model)
 
app/assets/javascripts/backbone/views/error_view.js.coffee
@@ -0,0 +1,27 @@
+Cake.Views.Cakes ||= {}
+
+class Cake.Views.ErrorView extends Backbone.View
+  initialize: (options) ->
+    @attributesWithErrors = @options.attributesWithErrors
+    _.bindAll(@, "clearOldErrors", "renderErrors", "renderError", "fieldFor")
+
+  render: () ->
+    @clearOldErrors()
+    @renderErrors()
+
+  clearOldErrors: () ->
+    @$(".error").removeClass("error")
+    @$("p.inline-errors").remove()
+
+  renderErrors: () ->
+    _.each(@attributesWithErrors.errors, @renderError)
+
+  renderError: (errors, attribute) ->
+    errorString = errors.join(", ")
+    field = @fieldFor(attribute)
+    errorTag = $('<p>').addClass('inline-errors').text(errorString)
+    field.append(errorTag)
+    field.addClass("error")
+
+  fieldFor: (attribute) ->
+    @$("input[id*='_#{attribute}']").parent()
app/controllers/api/v1/cakes_controller.rb
@@ -10,6 +10,28 @@ module Api
       def show
         respond_with(@cake = current_user.creations.find(params[:id]))
       end
+
+      def create
+        CreateCakeCommand.new(self).run(cake_params, params[:cake_tags])
+      end
+
+      def create_cake_succeeded(cake)
+        respond_with(@cake = cake)
+      end
+
+      def create_cake_failed(cake)
+        respond_with(@cake = cake)
+      end
+
+      def update
+        raise params.inspect
+      end
+
+      private
+
+      def cake_params
+        params.require(:cake).permit(:name, :story, :is_restricted, :watermark, :category_id)
+      end
     end
   end
 end
app/models/creation.rb
@@ -1,5 +1,6 @@
 class Creation < ActiveRecord::Base
   validates :name,  :presence => true
+  validates :category_id, :presence => true
   belongs_to :user, :counter_cache => true
   belongs_to :category
   has_many :photos, -> { order :created_at }, :dependent => :destroy
app/views/api/v1/cakes/create.json.jbuilder
@@ -0,0 +1,1 @@
+json.partial! 'cake', cake: @cake
config/routes.rb
@@ -46,7 +46,7 @@ Cake::Application.routes.draw do
 
   namespace :api, :defaults => { :format => 'json' }  do
     namespace :v1 do
-      resources :cakes, :only => [:index, :show] do
+      resources :cakes, :only => [:index, :show, :create, :update] do
         resources :photos, :only => [:index]
       end
       resources :logins, :only => [:create]