【问题标题】:How can I set my Rails controllers to, by default, only accept HTML requests?如何将我的 Rails 控制器设置为默认只接受 HTML 请求?
【发布时间】:2014-02-18 15:04:14
【问题描述】:

我的大多数控制器仅在 HTML 中具有有意义的响应。考虑以下场景:

我做了一个简单的控制器

class FrontController < ApplicationController
  def index
  end
end

并提供app/views/front/index.html.erb。如果我使用Accept: text/html 执行该操作,它会按预期呈现该模板。

如果我使用Accept: application/xml 进行该操作,我想获得406 Not Acceptable。相反,Rails 会引发 ActionView::MissingTemplate 异常,并显示 500 错误:

缺少模板前端/索引,应用程序/索引与 {:locale=>[:en], :formats=>[:xml], :handlers=>[:erb, :builder, :raw, :ruby, : jbuilder, :coffee]}.


我可以通过两种方式从控制器中获取406 Not Acceptable。首先,我可以使用respond_to 块:

class FrontController < ApplicationController
  def index
    respond_to do |f|
      f.html
    end
  end
end

其次,我可以使用respond_with,尽管它在不代表资源的控制器中看起来很奇怪:

class FrontController < ApplicationController
  respond_to :html

  def index
    respond_with # No arguments, because there's nothing to put here.
  end
end

其中任何一个都将使用406 响应 XML 请求。但是,两者都需要向每个控制器操作添加代码。


这是我想做的事情:

  • 理想情况下,如果未找到模板,我希望隐式呈现的操作(未声明 render 调用或显式格式)返回 406。一般来说,这对于 Rails 来说似乎是一个明智的默认设置,我很惊讶它还没有这样做。

  • 1234563

想法?

(Rails 4.0.1,Ruby 2.0.0)

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

如果您不想使用 responds_to,可以这样做:

class ApplicationController < ActionController::Base
  before_filter :allow_only_html_requests

  ...

  def allow_only_html_requests
    if params[:format] && params[:format] != 'html'
      render :file => "#{RAILS_ROOT}/public/404.html"
    end
  end

  ...

end

【讨论】:

  • 限制了。如果没有明确提供其他格式,我只希望 :html-only 成为默认值。
  • (另外,响应应该将状态设置为:not_acceptable,并且呈现 HTML 响应可能不是响应专门要求 HTML 以外的其他内容的请求的最佳方式。):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
相关资源
最近更新 更多