2010-11-14 108 views
4

我最近加入了Rails应用程序开发(Rails3)的世界,我可能会滥用足够的资源路由。Rails3:适当使用路由和资源

默认的资源路由为我经常使用的URL提供了一些非常方便的帮助方法。我的问题是,我有控制器,我指定路由作为足智多谋,只是为了利用这些辅助方法。我有一些基本的网站导航,没有资源业务。

resource :home do 
    member do 
    get 'main' 
    get 'about' 
    get 'login' 
    get 'help' 
    end 
end 

有没有更好的方式来做我一直在做的事情?任何不需要我每次有新控制器操作时都手动添加路由条目的东西?

为了澄清,我想为控制器指定路由而不必显式添加任何新操作,但我也希望它自动生成辅助方法。到目前为止,我必须为每个我想要的操作明确添加路由。我可以做这个(在非足智多谋的方式)类似,

match 'home/about' => 'home#about' 

但我不希望有写非常不落入约定每路线。

+0

也许我误解你,但它听起来好像你希望它会自动通过您的控制器公众期待方法,并为它们创建命名路线。我读的是对的吗?如果是这样,看来你正在寻求一种甚至Rails无法提供的魔法。 – 2010-11-14 16:31:32

+0

不,我想你说得对。举个例子,像“match”这样的一行:controller(/:action)'“会自动检测控制器的动作并生成命名路由。我仍然在学习什么样的技巧轨道可用。另一方面,我不介意有人推荐一个更好的方法,或者给出一些他们通常为他们的应用程序做这些事情的例子。 – 2010-11-14 16:45:15

回答

1

您可以查看公共实例方法的控制器并自动生成路由。

# routes.rb 
HomeController.public_instance_methods(false).select{|m| !(m.to_s =~ /^_/)}.each do |m| 
    match "home/#{m}", :action => m, :controller => HomeController, :as => "home_#{m}" 
end 

这将需要明确的(非继承)公共实例从您的控制器方法,并选择那些以下划线(因为下划线的人产生了过滤器的方法,其余是实际行动)。然后它会为每个生成一条命名路线。

请注意,routes.rb仅在服务器启动时处理,因此您必须在添加新操作后重新启动服务器。

+0

这就是我现在正在研究的内容。不要进一步迫使你,但怎么可能以更通用的方式完成,所以我可以传递任何控制器名称?例如(假设它调用你定义的方法),generate_named_routes:home。我试图弄清楚Rails中是否有代码可以采用:home并将其变为HomeController。那么有一个生成命名路由的通用方法很简单。 – 2010-11-14 17:00:02

+0

尝试'“#{my_symbol.to_s.classify}控制器”。constantize'将符号转换为相应的控制器类。您可以将该类放入一个变量中,并使用它来代替直接指定控制器。 – edgerunner 2010-11-14 17:49:56

+0

感谢您的指导!我最终做了这件事,但为了补充我的故事,我有一个可怕的疏忽。这依赖于控制器上存在的操作方法。在某些情况下,我有一个没有为其定义动作方法的视图...我正在回归Rails的视图自动映射。如果我想进一步采取这一行动,我必须做一些观察,行动方法等的嗅探。可以蠕虫。突然间,使用“匹配”主页/关于''很容易。再次感谢! – 2010-11-14 21:55:18

2

这是另一个更简单的。只需添加一个通用路由到您的routes.rb

match ":controller/:action" 

底部,它会直接映射到指定的控制器的指定动作。如果你喜欢,你可以更具体些。例如,使用的get代替match来限制对HTTP GET请求,指定applicaple控制器等

get ":controller/:action", :constraints => { :controller => /home|help/ }