Rails- redirect_to携带不需要的id

时间:2018-03-10 17:30:21

标签: ruby-on-rails activerecord url-routing

我正在尝试从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,以便路由匹配。

2 个答案:

答案 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