Commit d20c0579
Changed files (9)
app
assets
javascripts
backbone
templates
views
controllers
api
models
views
api
v1
cakes
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]