【问题标题】:Rails rendering json partial in modelRails在模型中渲染json部分
【发布时间】:2012-03-03 06:58:20
【问题描述】:

在我们的 rails 3.2 应用程序中,我们使用 Jbuilder 来呈现我们的 json 响应(这里没什么特别的)。 json 视图可以像这样简单:

_model_name.json.jbuilder

json.extract!(page, :id, :name, :url_name)

我们经常需要返回一个深度嵌套的 json 对象,而 Jbuilder partials 非常适合这个:

_page.json.jbuilder

json.extract!(page, :id, :name, :url_name)
json.page_images (page_images) do |json, page_image|
    json.partial! page_image
end

最后一个示例将检索页面,并嵌套 page_images,json 表示......再次没什么特别的。

通常,单个部分会调用另一个部分,并且可能会返回 2 或 3 层深的嵌套 json 对象。

问题

就像我上面提到的,我们使用 Jbuilder partials 将多个 partials 快速链接在一起,为视图形成一个深度嵌套的 json 对象。我们还需要将这些完全相同的嵌套对象构建为哈希(而不是 json),并使它们可用于模型。

使用 .attributes 让 Jbuilder 对象输出散列很简单!方法,但是我们在让 Jbuilder 访问模型中的视图部分时遇到了一些严重的困难。

查看 Jbuilder 源代码,看起来 JbuilderTemplate 类需要访问控制器上下文才能使一切正常工作。

我们可能会尝试这样的事情:

class SomeClass

  def initialize pages
    @pages = pages
    @context = ActionController::Base.new
  end

  def to_hash
     builder = JbuilderTemplate.new(@context)
     builder.pages(@pages) do |json, page|
        json.partial! page
     end
     builder.attributes!
  end
end

上面的例子显然是不正确的,但它说明了需要做什么。我只是不确定如何从模型传递初始化控制器,然后传递控制器上下文。

我们正在关注的一些潜在客户:

谁能帮我们指出正确的方向?

【问题讨论】:

    标签: ruby-on-rails json ruby-on-rails-3.2 jbuilder


    【解决方案1】:

    我很确定你在这里是在正确的轨道上。如果您直接在初始化程序中传递块,您应该能够调用 json.array! 并正常构建部分。

    def to_hash
      builder = JbuilderTemplate.new(@context) do |json|
        json.array! @pages, partial: 'path/to/partial'
      end
      builder.attributes!
    end
    

    【讨论】:

      【解决方案2】:

      如果你真的需要这个功能,我可以给你看一些垫片:

      c = ActionController::Base.new
      c.instance_variable_set '@item', Item.find(5)
      JSON.parse c.render_to_string('items/show')
      

      【讨论】:

        【解决方案3】:

        我使用 ActiveModel::Serializer 来做同样的事情。您可以在模型或任何地方渲染 json - 我们这样做是为了预填充缓存。

        执行此操作的语法最初并不明显,所以我在这里发布:

        ItemSerializer.new(item).to_json
        

        【讨论】:

          【解决方案4】:

          找不到解决方案。我们退回到使用 as_json 来配置我们的模型 json 输出。

          【讨论】:

          • 如果您仍然希望能够重用您的 jbuilder 模板,请查看我的 answer below。
          猜你喜欢
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-27
          • 2010-11-18
          • 2013-07-17
          • 1970-01-01
          相关资源
          最近更新 更多