首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails 3多态路由

rails 3多态路由
EN

Stack Overflow用户
提问于 2012-06-07 10:36:21
回答 2查看 548关注 0票数 2

为了找到这个问题的答案,我想问一个新的问题是值得的.

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

我有一个基本的TransportController,然后每种类型的Transport都有一个相应的控制器(都在Transport命名空间下),即Transport::CarControllerTransport::PlaneController

我想知道如何为不同的Transport操作创建路由..。

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

我可能喜欢的是一个路由文件,类似于:

代码语言:javascript
复制
# for an action landing_gear_up only inside plane
match '/transport/plane/landing_gear_up',
      :controller => "Transport::PlaneController",
      :action => "landing_gear_up"

# for an action on every transport type that are handled differently
match '/transport/:type/choose_seat',
      :controller => "Transport::<type>Controller",
      :action => "choose_seat"

# for the actions that are handled commonly across every type of transport
match '/transport/:type/board', :to => "transport#board"
match '/transport/:type/depart', :to => "transport#depart"

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

EN

回答 2

Stack Overflow用户

发布于 2012-06-07 11:44:32

您可以在routes.rb中定义方法和变量,这些方法和变量可以使代码更加枯燥。举个例子来说明我是如何尝试的:

代码语言:javascript
复制
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路由 --从长远来看,它们可能会让你的生活更轻松。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 01:37:32

如果控制器中具有相同的继承层次结构,那么您就不必做任何特殊的事情。只需声明资源,为每个Controller声明不RESTful路由,您就完成了。PlaneController#board将自动调用TransportController#board。而特定于PlaneController的操作将仍然是特定于该控制器的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10930122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档