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

时间:2015-03-06 11:39:48

标签: ruby-on-rails ruby-on-rails-2

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

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

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

  3. EVAL。将所有代码放在一个文件中并在两个地方进行评估。完成此操作后,它可以正常工作,但我对此解决方法并不满意。

  4. 最好的做法是什么?

1 个答案:

答案 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