在没有模型对象 Rails 4 中覆盖渲染:json

Posted

技术标签:

【中文标题】在没有模型对象 Rails 4 中覆盖渲染:json【英文标题】:Override render :json in no model object Rails 4 【发布时间】:2013-11-28 14:36:59 【问题描述】:

我需要覆盖“render json”,但我不需要为模型覆盖它,在模型中我知道我可以打开 ActiveRecord::Base 并覆盖 as_json 方法。但我的问题是当我有这样的事情时

class TestController < ApplicationController

def index
   render json:  field: 'is a test' 
end

end

我的问题是因为我使用了一个 gem,其中一些方法我需要返回“render json”,而这个 gem 没有为此集中的方法。我认为在 gem 的分支中并重构它,因为我可以覆盖集中式方法,但首先我想知道是否可以覆盖渲染。

【问题讨论】:

这里有实际问题吗?该代码很好。 请指定宝石。那是主动模型序列化器吗? 问题是我希望“render json”不返回 field: 'is a test' 我想要我的自定义 json 格式示例 status: 'ok', response: field: '是一个测试' . 我的问题是宝石 Opro 和响应 /oauth/token 或其他什么 不能直接用 status: 'ok', response: field: 'is a test' 吗? 【参考方案1】:

您可以在那里打开 ActionController::Base 类并覆盖渲染方法。但是我不确定这是否是最好的主意,这取决于您遇到的实际问题,并且您没有向我们提供有关问题的太多细节,即您期望得到什么以及您实际得到什么。

更新

我可能会喜欢这样的东西:

class ActionController::Base
  def render *args
    options = args.extract_options!
    if options[:json]
      \\ do whatever you need here
    end
    args << options
    super *args
  end
end

【讨论】:

好吧,我告诉你。我有一个 api 我的正常 api 响应是: status:'ok', response: field:'is a example' 我想为我的 api 实现 oauth,然后我看到了 gem Opro(github.com/opro/opro)但在这个 gem 中,控制器响应:field:'is a example' 我有一个继承“ActionController::Base”的 ApiController,它有两种正确准备响应的方法。然后在我的 api 控制器中,当渲染 json 调用我的方法并使用我的格式正常工作,但是opro 的控制器只是像 rails 默认一样渲染 json。 那我的问题是,我可以用我的格式覆盖opro的控制器渲染json的rails渲染json响应吗? 我想不出有什么理由你不能。这是红宝石——我们可以做我们需要的一切。如果问题出在您的 API 控制器上,您可以在那里覆盖它,但我知道您想改进 gem 本身。如果是这样,您将需要覆盖模块 gem 中的 render 用于增强控制器(显然)。然而,由于原始渲染方法相当复杂,我可能会尝试尽可能多地重用原始版本。也许像我添加的代码来回答? 谢谢!!我为我工作!我在覆盖 gem 控制器中应用了您的代码,它的工作!谢谢!!

以上是关于在没有模型对象 Rails 4 中覆盖渲染:json的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 生成模型

渲染 json 未显示在 rails 4 的视图中

在没有在模型中定义的情况下在 rails 中创建 slug

将rails多态关联对象渲染为JSON

Rails 4:在没有命名空间模型的子路径中组织 Rails 模型?

使用rails 5在json中渲染多个包含