为什么我的全部路线不能用于某些路线?

时间:2015-04-25 04:26:36

标签: ruby-on-rails ruby-on-rails-4

我在routes.rb

中有这个
resources :emergencies, except: [:new, :edit, :destroy], defaults: { format: :json }
match '*path', to: 'application#page_not_found', via: :all

我也在application.rb

中有这个
config.exceptions_app = self.routes

我的application_controller.rb看起来像这样:

class ApplicationController < ActionController::Base
  def page_not_found
    render json: { message: 'page not found' }, status: :not_found
  end
end

我有一组测试套件可以测试:new,:edit和:destroy route。以下路由:edit和:destroy pass,返回未按预期找到的消息页面,但:new route返回null。事实上,/emergencies/anything之类的任何内容都会呈现null,但/emergences/new/new之类的内容会正常工作。任何关于为什么会发生这种情况的想法以及如何解决它以便路线/emergencies/new正在进行page_not_found行动?

2 个答案:

答案 0 :(得分:1)

运行rake routes以了解您的路线如何布局。

你会注意到show route匹配emergencies /:id(例如,这包括紧急情况/新)。

路线从上到下匹配。通常,资源在show route之前声明新路由,以捕获与未来声明匹配的内容。

如果可以,请为您的节目路线添加约束,如果不匹配该ID,则至少与新的不匹配。或者您可以保留资源路径并将它们踢到控制器中的before_filter中的page_not_found方法...

答案 1 :(得分:0)

我看到这已经有了上面的答案,但是当找不到路线时,所有301重定向实施都非常简单。在下面的示例中,找不到重定向到root的页面。

Rails.application.routes.draw do
  root 'static_pages#home'
.
.
. 

  # This is a catchall 301 redirect to home (does not help with (e) type errors --  MUST BE LAST )
  get "*path", to: redirect('/')
end