【问题标题】:Rails 3 - new controller action routeRails 3 - 新的控制器动作路线
【发布时间】:2014-03-09 18:20:39
【问题描述】:
我有一个包含在线培训的应用程序,每个在线培训都有几个章节。我不想仅仅为培训章节创建下一个控制器。我想在 TrainingsController 中有新的动作,它可能被称为章节。然后我想要这样的网址:
/trainings/1/chapter/3
(/controller/训练的id/action/章节的id)
您能帮我如何设置 routes.rb 来实现这种行为吗?我尝试了很多东西,但它仍然坏了。
提前谢谢你!
彼得
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
rails-routing
【解决方案1】:
您可以将路线定义为:
resources :trainings do
get 'chapter/:chapter_id', action: :chapter, as: :training_chapter, constraints: { chapter_id: /\d+/ }
end
然后在你的trainings_controller.rb:
def chapter
# params[:chapter_id]
...
end
get 'chapter/:chapter_id', action: :chapter, as: training_chapter, constraints: { chapter_id: /\d+/ } 行定义了一个get 路由,格式为training/:id/chapter/:chapter_id,它执行TrainingController 中的chapter 操作。
这条路由的名字是training_chapter,由as: :training_chapter定义,所以你可以使用命名的路由助手比如training_chapter_trainings_path。
最后一个选项constraints: /\d+/ 是限制chapter_id 可以保存的值,基于这些值执行此路由。因此,对/trainings/1/chapter/1 的获取请求会执行chapter 操作,而/trainings/1/chapter/a 不会,因为chapter_id 的值a 是非数字的。
【解决方案2】:
我想这就是你要找的东西:
match '/trainings/:training_id/chapter/:chapter_id' => 'trainings#chapter', :as => 'chapter_training'
app/controllers/trainings_controller.rb
def chapter
end