暂时试图找到这个问题的答案,我觉得值得问一个新问题......
我有多个多态模型,定义如下:class Transport
,class Transport::Car < Transport
,class 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
我觉得这应该是“动态细分”的可能,但我无法让它正常工作。有什么建议吗?
答案 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的操作将保持特定于该控制器。