module Sinatra::Backstage::REST::Routing

Public Class Methods

included(controller) click to toggle source
# File lib/sinatra/backstage/rest/rest_routes.rb, line 16
def self.included(controller)
        controller.extend self
end

Public Instance Methods

rest_get_all(klass, params = {}) click to toggle source
# File lib/sinatra/backstage/rest/rest_routes.rb, line 103
def rest_get_all(klass, params = {})
        klass.all params.keys_to_sym
end
rest_routes(klass, namespace, display_list = false) click to toggle source
# File lib/sinatra/backstage/rest/rest_routes.rb, line 20
def rest_routes(klass, namespace, display_list = false)

        ## Routes
        ### get list
        get namespace do
                ## get format
                # puts "-- REST.Routing get namespace ( params = #{params})"
                format = params.delete('format') || 'html'
                # puts "-- REST.Routing get namespace after format ( params = #{params})"
                format = 'json' if request.accept.include_any?('text/json', 'application/json')
                ## get json options
                json_method = params.delete('json_method')
                json_opts = {:methods => ([json_method] || [])}
                ## get objects
                @objects = rest_get_all klass, params
                # puts "-- REST.Routing get namespace ( @objects = #{@objects})"
                # puts "-- REST.Routing get namespace ( @objects.to_a = #{@objects.to_a})"
                # puts "-- REST.Routing get namespace ( @objects.to_json = #{@objects.to_json})"
                # puts "-- REST.Routing get namespace ( @objects.to_a.to_json = #{@objects.to_a.to_json})"
                ## return
                case format
                when 'html'
                        halt eval "#{settings.render_engine} '#{klass.demodulize.downcase}/list'"
                when 'json'
                        halt @objects.to_json(json_opts)
                end
                error 406
        end

        ### get add-form
        get "#{namespace}/new" do
                template = ["#{klass.demodulize.downcase}/new"]
                if display_list
                        @objects = rest_get_all(klass)
                        template.unshift "#{klass.demodulize.downcase}/list"
                end
                eval "#{settings.render_engine} ['#{template.join('\',\'')}']"
        end

        ### create object
        post "#{namespace}/new" do
                # puts "params = #{params}"
                # puts "-- rest_routes post namespace = #{namespace}"
                # puts "-- rest_routes post klass = #{klass}"
                # halt
                @errors = []
                begin
                        object = klass.create params[:object]
                        redirect namespace
                rescue DataMapper::SaveFailureError => e
                        puts e.resource.errors.inspect
                        e.resource.errors.each do |error|
                                puts "-- REST.Routing new ( error = #{error} )"
                                @errors << error
                        end
                        @errors.flatten!
                end
        end

        get "#{namespace}/:id" do |id|
                @object = klass.get!(id)
                template = ["#{klass.demodulize.downcase}/edit"]
                if display_list
                        @objects = rest_get_all(klass)
                        template.unshift "#{klass.demodulize.downcase}/list"
                end
                eval "#{settings.render_engine} ['#{template.join('\',\'')}']"
        end

        ### update object
        put "#{namespace}/:id" do |id|
                klass.get!(id).update params[:object]
                redirect (display_list ? "#{namespace}/#{id}" : namespace)
        end

        ### delete object
        delete "#{namespace}/:id" do |id|
                klass.get!(id).destroy
                redirect namespace
        end

end