Created
December 20, 2008 17:30
-
-
Save phatmann/38362 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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