【问题标题】:Use one action for multiple models对多个模型使用一个操作
【发布时间】:2012-03-27 23:34:15
【问题描述】:

我有大约 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 中吗?如果问的不是太多,我怎么能这样做,以便他们也分享观点?

更新

如果这可以在各个控制器之外,那将是首选。如果我可以让它正常工作,我什至不想生成单独的控制器。

【问题讨论】:

  • 您可能有兴趣窥探或使用 José Valim 的 Inheritable Resources。 ActiveAdmin 将其用于默认的 RESTful 操作。

标签: ruby-on-rails ruby-on-rails-3 model


【解决方案1】:

这样的东西对你有用吗?

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 用于模块并且想知道为什么/何时使用 includeextend,请参阅 What is the difference between include and extend in Ruby?(基本上包括用于实例,扩展用于类方法)。

【讨论】:

  • 非常好!如果你不介意的话,我会坚持一会儿。如果我能找到我想要的答案,我什至不需要每个模型的控制器
  • @KyleMacey - 我认为我的编辑对你有用,但我还没有测试过。如果您尝试过但它不起作用,请告诉我,以便我删除它。
  • 您可以使用constantize,而不是使用Object.const_get。您可以将整行缩短为 m = name.chomp('Controller').classify.constantize
  • 我认为注意何时使用includeextend 可能会很有用,人们可能已经听说过,所以我在这个答案的底部添加了这个(上图)作为注意。
  • 代码self.class.to_s.chomp('Controller')可以替换为controller_name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多