对多个模型使用一个操作

Kyl*_*cey 6 model ruby-on-rails ruby-on-rails-3

我有大约5个表现非常相似的模型.事实上,我希望他们分享一个显示它们的动作.例如,对于模型Car,Truck,Van我想要一个如下定义:

[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
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

如果这可以在各个控制器之外,则是优选的.如果我能够正常工作,我甚至不需要生成单独的控制器.

Kyl*_*yle 4

这样的事情对你有用吗?

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

在控制器中:

class CarsController < ApplicationController
  include Display 
end

class TrucksController < ApplicationController
  include Display 
end

class VansController < ApplicationController
  include Display 
end
Run Code Online (Sandbox Code Playgroud)

编辑:尝试在没有单独控制器的情况下执行此操作

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

路线.rb

match "display" => "display#index", :as => :display
Run Code Online (Sandbox Code Playgroud)

在一个视图中

link_to "Display Cars", display_path(:model => "Car")
link_to "Display Trucks", display_path(:model => "Truck")
link_to "Display Vans", display_path(:model => "Van")
Run Code Online (Sandbox Code Playgroud)

注意:如果您听说过extendfor 模块并且想知道为什么/何时使用includevs extend,请参阅Ruby 中的 include 和 extends 之间有什么区别?(基本上 include 用于实例,extend 用于类方法)。