Skip to content

Instantly share code, notes, and snippets.

@phatmann
Created December 20, 2008 17:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phatmann/38362 to your computer and use it in GitHub Desktop.
Save phatmann/38362 to your computer and use it in GitHub Desktop.
class ResourceController < Application
@@page_size = nil
def index
display_collection
end
def show
display get_resource
end
def new
only_provides :html
display new_resource
end
def edit
only_provides :html
display get_resource
end
def create
if new_resource.save
redirect resource(@resource), :message => {:notice => "#{resource_class_name} was successfully created"}
else
raise NotAcceptable
end
end
def update
if get_resource.update_attributes(get_attributes)
redirect resource(@resource)
else
raise NotAcceptable
end
end
def destroy
if get_resource.destroy
redirect resource(controller_name.to_sym)
else
raise InternalServerError
end
end
def delete(id)
destroy(id)
end
class <<self
def paginate(page_size = 25)
@@page_size = page_size
end
end
protected
def get_resource
params.each do |k, v|
case k.to_s
when /(.+)_id/
raise "Resources more than one level deep not supported" if @parent
@parent = find_resource($1.camel_case, v)
when 'id'
@resource = find_resource(resource_class_name, v)
end
end
@resource
end
def get_collection
name = controller_name.snake_case
@collection = if @parent
@parent.send(name.to_sym)
else
resource_class.all
end
if @@page_size
@collection = @collection.paginate(:page => params[:page], :per_page => @@page_size)
end
instance_variable_set(:"@#{name}", @collection)
end
def get_attributes
params[resource_class_name.snake_case.to_sym] || {}
end
def new_resource
@resource = resource_class.new(get_attributes)
instance_variable_set(:"@#{resource_class_name.snake_case}", @resource)
end
def display_collection
display get_collection
end
private
def find_resource(class_name, id)
resource = Kernel.const_get(class_name).get!(id)
instance_variable_set(:"@#{class_name.snake_case}", resource)
end
def resource_class_name
controller_name.singular.camel_case
end
def resource_class
Kernel.const_get(resource_class_name)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment