2015-06-26 127 views
0

我有3个不同的模型/控制器。我试图做类似Rails中的动态路由

// routes.rb 
get ':type' => ':type#show' 

但如预期,它没有工作。我想根据URL中指定的类型路由到控制器。如何实现这一目标?

+0

什么是'type'?你怎么设置它? – Pavan

+0

@Pavan这是3类继承的User类中的一行。 –

+0

@BurakÖzmen尝试简要解释你的问题 –

回答

1

你可以创建一个通用控制器,并使用redirect_to在那里读取params[:type]并相应地重定向,但我不明白为什么你不能只使用正确的路线,例如。

get '/some_path/:id', to: 'mycontroller#method' 

如果它们是标准的CRUD控制器,那么您应该考虑使用资源类型路由。

+0

我可以做到这一点,但我不想将所有三种可能的类型路由到每个控制操作,这会使我的工作增加三倍。另外我是Rails的新手,并试图扩展我对可能解决方案的了解。 –

+1

好的,如果我们知道这三种行为的名字/意图,这会有所帮助。如果他们是粗暴行动,我真的会推荐使用足智多谋的路线,例如。 'resource:thing'会自动路由任何'show','index','create','update'等控制器'ThingsController'的请求。在Rails中使用这些是惯用的;如果你坚持使用自定义路由,在回答中有3行不是重复的,并且适用于代码清理。 – EdvardM

0

这听起来像你正在寻找使用rails可选段键。 Rails 3引入了这个语法来定义URL模式的可选部分。尝试是这样的:

match ':controller(/:show(/:id))', via: 'get' 

在你的路由文件的最后将这个路线,因为它将作为一个包罗了所有在你的应用程序,几乎所有路线采取行动。在碰到这个之前不匹配。您可以通过指定某个动作更具体的三个不同的控制器可以共享等

0

您可以使用约束

#routes.rb 
get "/type" => "controller_A#show", 
    :constraints => lambda { |request| request.params[:type] == "A" } 

get "/type" => "controller_B#show", 
    :constraints => lambda { |request| request.params[:type] == "B" } 

get "/type" => "controller_C#show", 
    :constraints => lambda { |request| request.params[:type] == "C" }