在Rails 4中禁用除HTML之外的其他格式?

时间:2015-02-25 09:40:30

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

我们最终会有很多

ActionView::MissingTemplate (Missing template presentations/show, application/show with {:locale=>[:en], :formats=>["image/*"], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}

在我们的日志中。

应用程序目前仅执行HTML,因此我希望所有其他格式返回406(或其他)。有没有办法为所有渲染调用设置一次?或者我们是否必须到处散布respond_to

谢谢!

5 个答案:

答案 0 :(得分:1)

您可以向rescue_from添加ApplicationController.rb行:

class ApplicationController < ActionController::Base

  rescue_from ActionView::MissingTemplate do |e|
    render nothing: true, status: 406
  end

  # ...

end

如果我尝试在我的Rails应用程序中访问document.xml(而不是document.pdf),Firefox会在浏览器控制台中显示以下消息:

GET http://localhost:3000/quotes/7/document.xml [HTTP/1.1 406 Not Acceptable  29ms]

答案 1 :(得分:1)

我最终选择了混合解决方案,因为我无法让respond_to工作。每当有人尝试某些不受支持的mime类型时,这将发送406。

before_filter :ensure_html

def ensure_html
  head 406 unless request.format == :html
end

答案 2 :(得分:0)

respond_to :html放在ApplicationController

答案 3 :(得分:0)

您可以按照以下方式执行此操作

class UsersController < ApplicationController
    respond_to :html

    def index
      @users = User.all
      respond_with(@users)
    end
  end

respond html actions users controller

的所有ApplicationController

或者如果您想响应所有控制器

然后将其添加到 class ApplicationController < ActionController respond_to :html end 只需

 class UsersController < ApplicationController
    def index
      @users = User.all
      respond_with(@users)
    end
  end

{{1}}

答案 4 :(得分:0)

如果在运行操作之前未使用respond_with或希望ActionView::MissingTemplate被引发(即为了防止模型被提取等),您可以使用响应者gem中的verify_requested_format!

class UsersController < ApplicationController
  respond_to :html

  before_action :verify_requested_format!

  def index
    # ...
  end
end

然后验证:

curl -v -H "Accept: image/*" localhost:9000/users

< HTTP/1.1 406 Not Acceptable

顺便提一下,您也可以使用respond_with而不传递模型实例,例如:

class UsersController < ApplicationController
  respond_to :html

  def index
    @users = User.all
    respond_with
  end
end

但据我所知,这似乎没有记录在案。

  • rails 4.2
  • 响应者2.4