我有以下路线:
get 'calendar(/:month(/:year))' => 'calendar#show', as: :calendar,
constraints: { month: /[a-z]+/, year: /\d{4}/ },
defaults: { month: Date::MONTHNAMES[Date.today.month].downcase, year: Date.today.year }
在控制台中使用此路线我得到:
app.calendar_path(month: 'september', year: '2017')
=> "/calendar"
哪个好,因为它实现了这些参数是我写这个时的默认值,所以它会从生成的路径中删除它们。
但我不明白为什么:
app.calendar_path(month: 'september', year: '2018')
=> "/calendar"
2018年是明年,所以我希望这条路可以是“/ calendar / september / 2018”。 2019年的行为是相同的,并且任何一年的月份都是当前的行为。
编辑:仅在Rails 4.2.6中重现,Rails 4.2.8 - 似乎在Rails 5 +中修复
答案 0 :(得分:1)
看起来它是路径中具有可选部件并具有默认值的组合。至少从渲染的角度来看,这种组合对你的思考没有任何意义。我没有检查调度,我可以看到为什么你想要有可选部件,但你可能会为此目的指定一个单独的路径:
get 'calendar/:month/:year' => 'calendar#show',
as: :calendar,
constraints: { month: /[a-z]+/, year: /\d{4}/ },
defaults: { month: Date::MONTHNAMES[Date.today.month].downcase,
year: Date.today.year }
# :year can be omitted here as the route before would have caught that
get 'calendar(/:month)' => 'calendar#show',
as: :calendar_fallback,
constraints: { month: /[a-z]+/ }