带有额外变量的Rails自定义路径

时间:2015-02-10 02:14:24

标签: ruby-on-rails ruby routing

我有一个定义的自定义rails路由:

resources :scores, path: "seasons/:season_id/scores/:student_id"

这对我的应用程序有意义,并会保持网址标准化。这适用于节目页面,我能够正确地抓住:season_id和:student_id。

但是,当我尝试路由到任何其他页面时,我会收到错误。我希望新的和编辑页面是这些路线:

resources :scores, path: "seasons/:season_id/scores/:student_id/new"

修改

resources :scores, path: "seasons/:season_id/scores/:student_id/:id/edit"

所以他们仍然遵循正常的约定,这就是当我运行rake路线时会发生什么,但是击中任何路线会抛出:

ActionController::UrlGenerationError

No route matches {:action=>"show", :controller=>"scores", :format=>nil, :id=>nil, :season_id=>#<Score id: ... >, :student_id=>nil} missing required keys: [:id, :student_id]

两个帐户有点奇怪。季节ID与分数对象相关联,并且表示缺少键。所有密钥都存在于params哈希中,这就是我构建链接的方式:

= link_to "Edit", { controller: :scores, action: :edit, id: score.id, student_id: params[:student_id], season_id: params[:season_id]} , class: "btn btn-success btn-xs"

1 个答案:

答案 0 :(得分:1)

当您需要嵌套资源时,最好不要使用resourcespath。它更容易阅读和理解,更不容易出错,这是Rails惯例。

您可以像这样编写路线:

resources :seasons do
  resources :students do
    resources :scores
  end
end

然后在链接中使用命名路径方法,如下所示:

link_to "Edit", edit_score_student_season_path(score, params[:student_id], params[:season_id]), class: "btn btn-success btn-xs"