Ruby on Rails选择错误的控制器动作

麦克风

今天,我遇到了一些奇怪的(非常不便)的Ruby on Rails行为,即使持续地对网络进行梳理也无法得出令人满意的答案。注意:我翻译了方法和路线名称,以英语更容易阅读,希望我不会引入任何不一致之处。

情况

环境

在Ruby 2.0下执行的Ruby on Rails 4.2.0(也在Ruby 2.2.0下进行了测试)

相关代码

考虑采取以下措施的控制器:

class AssignmentsController < ApplicationController
  def update
    ...
  end

  def takeover_confirmation
    ...
  end
end

routes.rb

由于我使用了许多手动定义的路由,因此没有使用routes.rb中的资源。有关路由的定义如下:

...
post 'assignments/:id' => 'assignments#update', as: 'assignment'
post 'assignments/takeover_confirmation' => 'assignments#takeover_confirmation'
...

相关输出rake routes

assignment POST  /assignments/:id(.:format)  assignments#update
assignments_takeover_confirmation  POST  /assignments/takeover_confirmation(.:format) assignments#takeover_confirmation

问题

当我对进行POST时assignments_takeover_confirmation_path,rails会将其路由到update方法。服务器日志:

Started POST "/assignments/takeover_confirmation" for ::1 at ...
Processing by AssignmentsController#update as HTML

减轻

如果我把update路由定义takeover_confirmation一个,它按预期工作(没有检查的支撑柱,update虽然)。

此外,写完所有这些内容后,我发现我update在route.rb中使用了错误的请求类型(POST而不是PATCH)。在routes.rb中这样做确实可以解决我的问题:

patch 'assignments/:id' => 'assignments#update', as: 'assignment'

但是,即使将其定义为POST,Rails也不应将POST请求定向到现有路径“ / assignments / takeover_confirmation”的完全不同的操作,应该吗?我担心下次我对同一控制器使用两个POST路由时,它将再次执行相同的操作。

似乎我对Rails路由有严重的误解,但不能对此付诸行动...

编辑:解决方案

正如katafrakt所解释的,上述请求/assignments/takeover_confirmation与路由匹配是assignments/:id因为Rails将“ takeover_confirmation”部分解释为字符串并将其用于:id参数。因此,这是完全可以预期的行为。

工作实例

为了完整起见,这是一个可行的(如果是极简的)路由定义,它的工作受到了克里斯的评论的启发:

  resources :assignments do
    collection do
      post 'takeover_confirmation'
    end
  end

在此示例中,仅明确定义了我手动创建的路由。现在,我隐式地定义了更新,表演等路线(我首先手动定义)resources: :assignments

相应摘录rake routes

...
takeover_confirmation_assignments  POST  /assignments/takeover_confirmation(.:format) assignments#takeover_confirmation
...
assignment GET    /assignments/:id(.:format)  assignments#show
           PATCH  /assignments/:id(.:format)  assignments#update
           PUT    /assignments/:id(.:format)  assignments#update
           DELETE /assignments/:id(.:format)  assignments#destroy
....

谢谢您的帮助!

卡塔夫拉特

但是,即使将其定义为POST,Rails也不应将POST请求定向到现有路径“ / assignments / takeover_confirmation”的完全不同的操作,应该吗?

这应该。Rails路由的匹配顺序与routes.rb文件中定义的顺序完全相同(从上到下)。因此,如果它与某个规则/assignments/takeover_confirmation匹配(并且assignments/:id规则匹配),它将停止处理路由。

此行为简单有效。我认为匹配最佳路线的任何一种“智能”都会导致麻烦而出乎意料的结果。

顺便说一句,这就是为什么以前在路由文件的最底部定义了全部路由的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ruby on Rails,获取启动该控制器动作的URL

来自分类Dev

Ruby on Rails 控制器

来自分类Dev

Ruby on Rails在控制器上获取验证错误消息

来自分类Dev

Ruby on Rails错误。处理控制器方法为png

来自分类Dev

Ruby on Rails:使用控制器,动作和参数获取路线

来自分类Dev

如何在Ruby on Rails中添加自定义路线,控制器和动作?

来自分类Dev

Ruby on Rails:使用控制器,动作和参数获取路线

来自分类Dev

Ruby on Rails-如何使控制器与Ajax同时执行2个动作?

来自分类Dev

Ruby on Rails控制器语法

来自分类Dev

Ruby on Rails控制器语法

来自分类Dev

Ruby on Rails会话控制器InvalidAuthenticityToken

来自分类Dev

Ruby on Rails控制器语法

来自分类Dev

Ruby on Rails控制器和模型

来自分类Dev

控制器中的Ruby Rails循环

来自分类Dev

Ruby on Rails 控制器测试

来自分类Dev

CSS和JS无法在Rails的一个控制器ruby中以两个动作加载

来自分类Dev

如何将Rails动作或控制器名称放入我的Ruby Gem中以在日志文件中使用?

来自分类Dev

如何在Rails上的ruby中重定向到另一个控制器动作

来自分类Dev

在Rails控制器中调用ruby方法会引发错误

来自分类Dev

Rails Web应用程序控制器上的ruby生成错误

来自分类Dev

在Ruby on Rails中,如何将控制权传递给另一个控制器中的动作?

来自分类Dev

Ruby on Rails-没有视图的控制器

来自分类Dev

使用Ruby On Rails的控制器中的实例变量

来自分类Dev

Ajax如何从Rails控制器上的ruby检索数据

来自分类Dev

Ruby on Rails-控制器子目录

来自分类Dev

模型,视图和控制器之间的Ruby on Rails关系

来自分类Dev

Ruby on Rails:控制器未评估方法

来自分类Dev

控制器中的get和post方法。Ruby on Rails

来自分类Dev

Ruby on Rails-“胖模型,瘦控制器”实践

Related 相关文章

  1. 1

    Ruby on Rails,获取启动该控制器动作的URL

  2. 2

    Ruby on Rails 控制器

  3. 3

    Ruby on Rails在控制器上获取验证错误消息

  4. 4

    Ruby on Rails错误。处理控制器方法为png

  5. 5

    Ruby on Rails:使用控制器,动作和参数获取路线

  6. 6

    如何在Ruby on Rails中添加自定义路线,控制器和动作?

  7. 7

    Ruby on Rails:使用控制器,动作和参数获取路线

  8. 8

    Ruby on Rails-如何使控制器与Ajax同时执行2个动作?

  9. 9

    Ruby on Rails控制器语法

  10. 10

    Ruby on Rails控制器语法

  11. 11

    Ruby on Rails会话控制器InvalidAuthenticityToken

  12. 12

    Ruby on Rails控制器语法

  13. 13

    Ruby on Rails控制器和模型

  14. 14

    控制器中的Ruby Rails循环

  15. 15

    Ruby on Rails 控制器测试

  16. 16

    CSS和JS无法在Rails的一个控制器ruby中以两个动作加载

  17. 17

    如何将Rails动作或控制器名称放入我的Ruby Gem中以在日志文件中使用?

  18. 18

    如何在Rails上的ruby中重定向到另一个控制器动作

  19. 19

    在Rails控制器中调用ruby方法会引发错误

  20. 20

    Rails Web应用程序控制器上的ruby生成错误

  21. 21

    在Ruby on Rails中,如何将控制权传递给另一个控制器中的动作?

  22. 22

    Ruby on Rails-没有视图的控制器

  23. 23

    使用Ruby On Rails的控制器中的实例变量

  24. 24

    Ajax如何从Rails控制器上的ruby检索数据

  25. 25

    Ruby on Rails-控制器子目录

  26. 26

    模型,视图和控制器之间的Ruby on Rails关系

  27. 27

    Ruby on Rails:控制器未评估方法

  28. 28

    控制器中的get和post方法。Ruby on Rails

  29. 29

    Ruby on Rails-“胖模型,瘦控制器”实践

热门标签

归档