如何在 2 个控制器中使用相同的方法?

How to use the same method in 2 controllers?

我有一个 Rails 2 的应用程序 API。我对控制器进行了版本化和优化,但有重复的方法。目标是只在一个地方拥有公共信息。所以我探索了以下选项:

  1. 重定向非API控制器的路由,但每个控制器都需要它的特定钩子

  2. 模块包含。这是我最喜欢的,但是有很多错误被抛出并且修复问题的时间非常有限。

  3. 评估。将所有代码放在一个文件中,并在两个地方进行评估。这样做,它有效,但我对此解决方法不满意。

最好的做法是什么?

这里可能有一些打字错误,但是:

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