为了找到这个问题的答案,我想问一个新的问题是值得的.
我有多个多态模型,定义如下:class Transport、class Transport::Car < Transport、class Transport::Plane < Transport
我有一个基本的TransportController,然后每种类型的Transport都有一个相应的控制器(都在Transport命名空间下),即Transport::CarController、Transport::PlaneController。
我想知道如何为不同的Transport操作创建路由..。
Transport子类(这是通过数据库调用作为初始化器的一部分)。Transport,都有两个共享控制器操作,称为#board和#depart。这些方法应该驻留在TransportController中,因为它们执行相同的操作并显示相同的视图,而不管传输的类型如何。Transport类型可以有自己的操作的不同实现。例如,汽车和飞机的#choose_seat是不同的,不同的约束和不同的视图,但行动是相同的。Transport类型有权有唯一的操作。例如,Transport::PlaneController应该有一个#landing_gear_up操作,而这对Transport::CarController没有意义。我可能喜欢的是一个路由文件,类似于:
# 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"我觉得这应该是可能的“动态段”,但我无法设法使它正常工作。有什么建议吗?
发布于 2012-06-07 11:44:32
您可以在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路由 --从长远来看,它们可能会让你的生活更轻松。
发布于 2012-06-08 01:37:32
如果控制器中具有相同的继承层次结构,那么您就不必做任何特殊的事情。只需声明资源,为每个Controller声明不RESTful路由,您就完成了。PlaneController#board将自动调用TransportController#board。而特定于PlaneController的操作将仍然是特定于该控制器的。
https://stackoverflow.com/questions/10930122
复制相似问题