Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## lib/expose.rb
- module Padrino
- module Routing
- module ClassMethods
- def expose(sym,opts={})
- klass = sym.to_s.classify.constantize
- find_by = opts[:find_by] || :id
- default_params = "params[:id] || params[:#{sym.to_s}_id]"
- collector = opts[:collect] ? opts[:collect] : "#{klass}.all"
- eval <<-EVAL
- helpers do
- def #{sym.to_s.pluralize}
- @#{sym.to_s.pluralize} ||= #{collector}
- end
- def #{sym.to_s}
- @#{sym.to_s} ||= if #{default_params}
- #{klass}.first(#{find_by} => #{default_params})
- elsif request.post?
- #{klass}.create(params[:#{sym.to_s}])
- elsif request.put?
- #{klass}.update_attributes(params[:#{sym.to_s}])
- else
- #{klass}.new
- end
- end
- end
- EVAL
- end
- end
- end
- end
- ## Usage controllers/pages.rb
- expose :page, :find_by => :slug, :collect => 'current_site.pages'
- ## Example RESTful controller in tandem with padrino responders
- Admin.controllers :pages do
- before { current_site }
- expose :page, :collect => "current_site.pages", :find_by => :slug
- get :index do respond(pages) end
- get :new do respond(page) end
- get :edit, :with => :id do respond(page) end
- get :show, :with => :id do respond(page) end
- post :create do
- page.save
- response = url(:pages, :index, :site_id => params[:site_id])
- respond(page,response)
- end
- put :update, :with => :id do
- page.update_attributes(params[:page])
- response = url(:pages, :index, :site_id => params[:site_id])
- respond(page,response)
- end
- delete :destroy, :with => :id do
- page.destroy ? flash[:notice] = 'Success!' : flash[:error] = 'Woops!'
- redirect(url(:pages, :index))
- end
- end
Add Comment
Please, Sign In to add comment