如何在 2 个控制器中使用相同的方法?
How to use the same method in 2 controllers?
我有一个 Rails 2 的应用程序 API。我对控制器进行了版本化和优化,但有重复的方法。目标是只在一个地方拥有公共信息。所以我探索了以下选项:
重定向非API控制器的路由,但每个控制器都需要它的特定钩子
模块包含。这是我最喜欢的,但是有很多错误被抛出并且修复问题的时间非常有限。
评估。将所有代码放在一个文件中,并在两个地方进行评估。这样做,它有效,但我对此解决方法不满意。
最好的做法是什么?
这里可能有一些打字错误,但是:
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
我有一个 Rails 2 的应用程序 API。我对控制器进行了版本化和优化,但有重复的方法。目标是只在一个地方拥有公共信息。所以我探索了以下选项:
重定向非API控制器的路由,但每个控制器都需要它的特定钩子
模块包含。这是我最喜欢的,但是有很多错误被抛出并且修复问题的时间非常有限。
评估。将所有代码放在一个文件中,并在两个地方进行评估。这样做,它有效,但我对此解决方法不满意。
最好的做法是什么?
这里可能有一些打字错误,但是:
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