我有一个带有API的Rails 2应用程序。我对控制器进行了版本控制和优化,但有一些重复的方法。目标是只在一个地方提供公共信息。所以我探讨了以下选项:
从非API控制器的路由重定向,但每个控制器都需要它的特定挂钩
模块包含。这是我最喜欢的,但有很多错误被抛出,而且时间非常有限。
EVAL。将所有代码放在一个文件中并在两个地方进行评估。完成此操作后,它可以正常工作,但我对此解决方法并不满意。
最好的做法是什么?
答案 0 :(得分:1)
可能会在这里潜伏着一些错别字,但是:
class GenericController < ApplicationController
def index
@objects = params[:controller].singularize.camelcase.constantize.all()
end
def show
@object = params[:controller].singularize.camelcase.constantize.find(params[:id])
end
def new
@object = params[:controller].singularize.camelcase.constantize.new
end
def edit
@object = params[:controller].singularize.camelcase.constantize.find(params[:id])
end
def create
model = params[:controller].singularize.downcase
@object = params[:controller].singularize.camelcase.constantize.new(params[model])
if @object.save
redirect_to '/'+params[:controller]
else
render :action => 'new'
end
end
def update
model = params[:controller].singularize.downcase
@object = params[:controller].singularize.camelcase.constantize.find(params[:id])
if @object.update_attributes(params[model])
redirect_to :controller => params[:controller], :action => 'index'
else
render :action => 'edit'
end
end
def destroy
if @object = params[:controller].singularize.camelcase.constantize.find(params[:id])
@object.destroy
end
redirect_to :controller => params[:controller], :action => 'index'
end
end
特定控制器可以根据需要覆盖这些实现,但是:
class ProjectsController < GenericController
# done!
end
class ScenariosController < GenericController
# done!
end