Ruby on Rails基础问题——关于路由

5

我有一个没有相关模型的控制器。该控制器用于从各种模型中跨越一些信息。我有很多操作,这些操作在页面上定义了某些视图。为此控制器组织路由的最佳方式是什么?

我想要的是将/dashboard/something指向dashboard控制器中的任何操作。不是new/edit之类的操作,而是任意的操作(showstats等)。

通过试错,我做了这样的事情:

map.dashboard 'dashboard/:action', :controller => 'dashboard', :action => :action

现在可以使用助手访问这些URL:
dashboard_url('actionname')

这种方法似乎运行良好,但这是正确的方法吗?我不太确定如何理解,辅助方法名称是如何生成的。如何生成与基本控制器“action_controller_url”相同的辅助程序名称?这将更通用并使代码更一致。
提前感谢。
3个回答

5
您不需要在路由中指定:action => :action键,这已经为您完成。除此之外,您目前的做法是正确的。
您还可以将其指定为符号:dashboard_url(:actionname),但您已经知道了;)

有没有一种方法可以重新格式化助手函数,或者提供自定义的助手函数?例如:actionname_dashboard_url 而不是 dashboard_url(:actionname)? - mdrozdziel
你需要为每一个单独定义一个新的路由。单数路由方法多了几个字符,但总体上代码更少。 - Ryan Bigg
是的,我以为有一些自动机制可以动态生成辅助函数,但既然不是这样,我就坚持使用dashboard_url(:actionname)约定。 - mdrozdziel

2
如果您想为所有仪表板操作提供帮助方法,您应该使用命名路由指定它们,例如:
map.example_dashboard 'dashboard/example', :controller => 'dashboard', :action => 'example'
map.another_dashboard 'dashboard/another', :controller => 'dashboard', :action => 'another'

然后Rails将为每个命名路由生成一个 _url 和一个 _path 的辅助方法。然而我更喜欢你的方法,因为它更灵活、简单易懂。

将OrdersController和ClientsController的索引页面作为服务于这些“仪表盘”的更好地方,怎么样? - Ryan Bigg
肯定的,我只是为了举例而编造的动作名称。我会把它改成别的什么东西。 - Teoulas

0
如何生成与基本控制器中的“action_controller_url”相同的帮助程序名称?
  map.action_controller(
    'action_controller',
    :controller => 'controller',
    :action => 'action',
    :conditions => { :method => :get }  # You can restrict the HTTP reqs allowed
  )

这并不是真正的答案。如果我有50个操作,那么我将不得不将此代码复制50次或在map上创建一些奇怪的循环... - mdrozdziel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接