对多个模型使用一个动作

我有大约5个模型的行为非常相似。 实际上,我希望他们分享显示它们的操作。 例如,对于汽车,卡车,范车型我想有一个像这样的定义:

[Car, Truck, Van].each do |Model|
  action_for Model do #I made this up to show what I mean
    def index
      @model = Model.all
      @model_names = @model.map(&:name).join(', ')
    end
  end
end

我将如何做到这一点,所以我没有在多个控制器中定义相同的动作? (这不是非常干燥)它会在application_controller吗? 如果问题不多,我怎么能这样做,让他们也分享观点?

UPDATE

如果这可以在单独的控制器之外,那将是优选的。 如果我能使这个工作正确,我甚至不想生成单个控制器。


像这样的东西适合你吗?

module Display
  def index
    m = self.class.to_s.chomp('Controller').classify.constantize
    @model = m.all
    @model_names = @model.map(&:name).join(', ')
  end
end

在控制器中:

class CarsController < ApplicationController
  include Display 
end

class TrucksController < ApplicationController
  include Display 
end

class VansController < ApplicationController
  include Display 
end

编辑:试图做到这一点,没有单独的控制器

class DisplaysController < ApplicationController
  def index
    @model = params[:model].constantize.all
    @model_names = @model.map(&:name).join(', ')
  end
end

的routes.rb

match "display" => "display#index", :as => :display

在一个视图

link_to "Display Cars", display_path(:model => "Car")
link_to "Display Trucks", display_path(:model => "Truck")
link_to "Display Vans", display_path(:model => "Van")

注意:如果您听说过extend模块并想知道为什么/何时使用include vs extend ,请参阅Ruby中的include和extend有什么区别? (基本上包括是为了实例,扩展为类方法)。

链接地址: http://www.djcxy.com/p/58229.html

上一篇: Use one action for multiple models

下一篇: Tell a configure script to use a relative path for