Rails 5全部用于请求格式

时间:2018-03-26 17:39:00

标签: ruby-on-rails routing ruby-on-rails-5

在Rails 5 routes.rb中,我最终得到了一个:#/ p>

match "*path" => "static_pages#not_found", via: :all

与此操作相结合,可以很好地处理无用的网址,例如“/ bla”或“/bla.html”。但对于具有不同请求格式的现有路由,这不起作用。例如,我有工作网址“/ authors”,无用的“/authors.jpg”正在获取:

AuthorsController#index is missing a template for this request format and variant. request.formats: ["image/jpeg"] request.variant: []

关于开发和生产中的HTTP 406。

我希望我的not_found操作可以处理未处理的请求格式。什么是Rails 5方式捕获所有请求格式?

来源是https://github.com/muhme/quote

2 个答案:

答案 0 :(得分:0)

您应该能够在路线中使用默认值来更严格地使用路线。我不相信这是http://guides.rubyonrails.org/routing.html#defining-defaults

的最佳选择
defaults format: :html do
  resources :authors
end

我认为更好的解决方案是rescue_from http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html#method-i-rescue_from

ActionView::MissingTemplate中使用rescue_from。我可能会设置某种错误通知,但是当这些仍然发生时会提醒您。

rescue_from ActionView::MissingTemplate do |exception|
  # render 404 and/or email yourself a notification
end

答案 1 :(得分:0)

最后,为我工作的是ApplicationController:

rescue_from ActionController::UnknownFormat do |exception|
  redirect_to(controller: 'static_pages', action: 'not_found', original_url: request.original_url)
end

与相应的行动一起:

def not_found
  @original_url = params[:original_url]
  if @original_url.blank?
    @original_url = request.original_url
  end

  respond_to do |format|
    format.all { render :status => 404, :formats => 'html', content_type: "text/html" }
  end
end