Rails路由默认怪异

时间:2017-09-28 08:31:39

标签: ruby-on-rails routes

我有以下路线:

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 +中修复

1 个答案:

答案 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]+/ }