rails 3多态路由

时间:2012-06-07 10:36:22

标签: ruby-on-rails ruby-on-rails-3 model-view-controller polymorphism rails-routing

暂时试图找到这个问题的答案,我觉得值得问一个新问题......

我有多个多态模型,定义如下:class Transportclass Transport::Car < Transportclass Transport::Plane < Transport

我有一个基础TransportController,然后每种类型的Transport都有一个相应的控制器(全部在Transport命名空间下),即Transport::CarController,{{1} }。

我想弄清楚如何为不同的Transport::PlaneController操作创建路由...

  • 我不知道我将拥有多少Transport个子类(这是通过数据库调用作为初始化程序的一部分完成的)。
  • 对于每个Transport,有两个共享控制器操作,称为Transport#board。这些方法应该位于#depart内,因为无论传输类型如何,它们都会执行相同的操作并显示相同的视图。
  • 不同的TransportController类型可以有不同的自己动作的实现。例如,汽车和飞机的Transport因不同的约束和不同的视图而不同,但行动是相同的。
  • 不同的#choose_seat类型有权拥有独特的操作。例如,Transport应该有一个Transport::PlaneController操作,而这对#landing_gear_up没有意义。

我可能想要的是路由文件,如:

Transport::CarController

我觉得这应该是“动态细分”的可能,但我无法让它正常工作。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以在routes.rb中定义可以使代码更干的方法和变量。我将如何尝试这样做的一个例子:

Your::Application.routes.draw do
  ## other routes

  ## helper method to define transport route
  def route_transport action, types
    match "/transport/:type/#{action}", :to => "transport##{action}" and return if types == :common
    [types].flatten.each { |t| match "/transport/#{t}/#{action}", :controller => "Transport::#{t}Controller", :action => action }
  end

  {
    :board => :common,
    :depart => :common,
    :landing_gear_up => :plane,
    :choose_seat => [:car, :plane],
    # action name => :common or transport type(s)
  }.each { |action, types| route_transport action, types }

  ## other routes
end

我没有检查代码,它可能包含错误。运行rake routes检查是否生成了正确的路由。

另外,请看RESTful routes - 从长远来看,它们可能会让您的生活更轻松。

答案 1 :(得分:0)

如果控制器中具有相同的继承层次结构,则不必执行任何特殊操作。只需声明资源,为每个Controller声明非RESTful路由,然后就完成了。 PlaneController#board会自动调用TransportController#board。特定于PlaneController的操作将保持特定于该控制器。