【问题标题】:Using "ApplicationController.new.render_to_string" in a Rails api app (config.api_only = true)在 Rails api 应用程序中使用“ApplicationController.new.render_to_string”(config.api_only = true)
【发布时间】:2018-12-07 11:52:06
【问题描述】:

我有一个 Rails 5 应用程序构建为 api app

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.api_only = true
  end
end

在我的一个控制器操作中,我需要渲染一些 Ruby 风格的 html,然后将其返回到 json 响应中。

一个标准的 Rails 应用程序会这样做:

# app/controllers/my_controller.rb
def my_action
  html = ApplicationController.new.render_to_string("my_erb_or_haml_file", locals: {foo: "bar"}, layout: false)
  render :json => {html: html}, :status => :ok
end

但是,对于我精简的 api 应用程序 ApplicationController.new.render_to_string 似乎只是渲染 " "。这让我很困惑,因为我希望它要么提供内容,要么引发异常。

任何建议我应该采取什么路线来生成 Ruby 风格的 html?

【问题讨论】:

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


【解决方案1】:

我猜你必须明确地使用基类。您的应用程序是 API 应用程序,因此您的控制器可能继承自 ActionController::API

ActionController::Base.new.render_to_string

【讨论】:

  • 这似乎有效。我还尝试了@TarunLalwani 的建议,从ActionController::Base 继承该特定控制器。它也奏效了。哪种解决方案会被认为是最轻量级的?
  • 我想这取决于您的用例,如果您想直接渲染 html,@Tarun lalwani 的答案可能是“轻量级”。但是如果你想返回一个将 html 渲染为正文/内容的 json,^ 可能更明确、更轻量级,因为它只是一个方法调用而不是一个类的整个继承。
  • 或者只是ActionController::Base.render
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多