我有大约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
我如何做到这一点,所以我没有在多个控制器中定义相同的动作? (这不是很干)它会在application_controller中吗?如果问的不是太多,我怎么能这样做,所以他们也分享观点?
更新
如果这可以在各个控制器之外,那将是优选的。如果我能够正常工作,我甚至不需要生成单独的控制器。
答案 0 :(得分: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
在控制器中:
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
,请参阅What is the difference between include and extend in Ruby?(基本上包括实例) ,扩展为类方法)。