2011-09-02 98 views
43

我在路由文件中加入:路由带有可选参数

map.show_book "/show_book/:name/year/:year", :controller => "book", :action => "show_version" 

我还补充说:

map.show_book "/show_book/:name", :controller => "book", :action => "show_version" 

,以显示最新的书不指定年份。

但它不起作用,如果我没有通过一年,它不能在“show_book/NAME”中找到路线。

你有一些想法,为什么它不工作?

谢谢!

PS。 我知道,我可以使用一年与参数,但我想用一年的URL

回答

82

Put the optional parts between parenthesis的一部分“一年= XXXX?”:

map.show_book "/show_book/:name(/year/:year)", :controller => "book", :action => "show_version" 

并删除第二条路线。

更新

以上回答仅供轨3及以上。颠倒这两个路线定义解决了这个问题(见下面的Alessandro的评论)。

+0

哇,这很简单,但我认为它只适用于Rails3。我忘了指定该项目在rails 2.3中。但是我发现使用两条路线就足够了,但是按照正确的顺序(我以错误的顺序写入)。 谢谢 –

+0

“唯一”不再是真实的,因为这在Rails 4中是有效的,并且可能还有将来的版本。 – AlexQueue

+1

有没有办法在未指定的订单的同一路线上有多个可选部件?很长的线... map.show_book“/ show_book /:name((/ year /:year)(/ day /:day))” –