Rails 5 API - 如何在特定控制器上响应 HTML 作为异常?

Rails 5 API - How to respond with HTML on a specific controllers as an exception?

我有 Rails API 应用程序。并且 99% 的路线是 JSON 路线。但是,我想添加一条将以 HTML 响应的路由。我该怎么做?

这是我当前的设置,当我浏览路线时,我在屏幕上看到一串 HTML 标签。

class ApplicationController < ActionController::API
   include ActionController::MimeResponds      
end

class DocumentPublicController < ApplicationController
  respond_to :html

  def show
    html = "<html><head></head><body><h1>Holololo</h1></body></html>"#, :content_type => 'text/html'
    respond_to do |format|
      format.html {render html: html, :content_type => 'text/html'}
    end
  end
end

有什么想法吗?

大多数新 API 只需要为 JSON 服务,但在 API 控制器中看到 respond_to 是很常见的。这是一个例子:

def show
  html = "<html><head></head><body><h1>Holololo</h1></body></html>"
  respond_to do |format|
    format.html { render :json => html }
  end
end

我们可以删除 respond_to,但是如果您在没有 .json 的情况下点击 url,您会看到它认为您在日志中使用 HTML

Processing by PeopleController#index as HTML

如果您希望您的路由响应为 HTML,您可以在路由中默认为 HTML

namespace :api, :defaults => {:format => :html} do
  namespace :v1 do
    resources :people
  end
end

所以你可以放弃 respond_to 让它有它的诅咒,然后默认你的路由生效为 HTML.

根据 Layouts and Rendering Guide:

When using html: option, HTML entities will be escaped if the string is not marked as HTML safe by using html_safe method.

所以你只需要告诉它字符串可以安全地呈现为 html:

# modified this line, though could be done in the actual render call as well
html = "<html><head></head><body><h1>Holololo</h1></body></html>".html_safe

respond_to do |format|
  format.html {render html: html, :content_type => 'text/html'}
end