我正在尝试从show动作重定向到自定义集合操作,但是id param正在被转移,导致路由失败。一个最小的例子:
routes.rb中:
resources :first_models, only: [:show]
resources :second_models do
get 'custom_action', on: :collection
end
first_models_controller.rb
class FirstModelsController < ApplicationController
def show
redirect_to controller: 'SecondModelsController', action: 'custom_action'
end
end
second_models_controller.rb
class SecondModelsController < ApplicationController
def custom_action
# Do something
end
end
设置完毕后,导航到/ first_models / 2会导致错误:
No route matches {:action=>"custom_action", :controller=>"SecondModelsController", :id=>"2"}
我无法弄清楚如何从原始请求中删除id param,以便路由匹配。
答案 0 :(得分:1)
发生这种情况的原因是您使用Hash参数调用redirect_to
。内部Rails使用url_for
来构建最终位置,而最终位置使用default_url_options
,它使用当前资源的ID。来自API文档:
缺少路线密钥可以从当前请求的参数填写(例如:controller,:action,:id以及放置在路径中的任何其他参数)。
请参阅:http://api.rubyonrails.org/v5.1/classes/ActionDispatch/Routing/UrlFor.html
解决方案:使用指定的路径助手。
在命令行上运行bundle exec rake routes
以获取所有路由和命名路径助手的列表。选择您需要的那个,并按如下方式使用它:
redirect_to my_named_path_helper_path
答案 1 :(得分:1)
问题不在于:
class FirstModelsController < ApplicationController
def show
redirect_to controller: 'second_models', action: 'custom_action'
end
end
您可以键入rails路由并查看所有路由以及rails如何识别它们。
这应该有效。但是你可以更明确地使用:
redirect_to custom_action_second_models_path