渲染嵌套的JSON和对象关系

时间:2016-05-19 20:53:00

标签: javascript ruby-on-rails ruby json

我正在尝试在我的Rails应用程序中建立一个类似于以下SO问题中的关系。 Rails Object Relationships and JSON Rendering

我希望我的JSON以与显示的相同的方式呈现:

[    
    {
      "modelb": {
        "id": "1",
        "modela": [insert the ModelA JSON for ID's 1, 2 and 3]
      }
    {
      "modelb": {
        "id": "2",
        "modela": [insert the ModelA JSON for ID's 3, 4 and 5]
      }
    }
]

我已经有一个控制器可以创建模型A所需的JSON,如下所示,但我不知道如何制作ModelB模型和控制器以便将该信息嵌套到另一组JSON中或如何指定ModelA对象会进入ModelB的哪些对象。

class JsonsController < ApplicationController
  before_action :set_json, only: [:show, :update, :destroy]

  # GET /jsons
  # GET /jsons.json
  def index
    @jsons = Json.all

    render json: @jsons
  end

  # GET /jsons/1
  # GET /jsons/1.json
  def show
    render json: @json
  end

  # POST /jsons
  # POST /jsons.json
  def create
    @json = Json.new(json_params)

    if @json.save
      render json: @json, status: :created, location: @json
    else
      render json: @json.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /jsons/1
  # PATCH/PUT /jsons/1.json
  def update
    @json = Json.find(params[:id])

    if @json.update(json_params)
      head :no_content
    else
      render json: @json.errors, status: :unprocessable_entity
    end
  end

  # DELETE /jsons/1
  # DELETE /jsons/1.json
  def destroy
    @json.destroy

    head :no_content
  end

  private

    def set_json
      @json = Json.find(params[:id])
    end

    def json_params
      params.require(:json).permit(:text, :parent, :id)
    end
end

任何资源或帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

正如@alexbezek已经说过你需要在控制器中获得ModelB,而不是Json

Rails有一个很棒的gem jbuilder,允许渲染json对象。您只需为每个json操作创建视图。

以下是示例:

# Controller
# ...  
def index
  @models_b = ModelB.all
end
...

并查看

#views/model_b/index.jbuilder

json.array! @models_b do |item|
  json.id item.id,
  json.modela: item.models_a
end

或者作为一种可能的方法,您可以在每个要显示为json的模型中定义方法as_json。这是一种将模型渲染为json对象的“手动非惰性”方式。

例如:

# ModelB
def as_json
  jsn = {
    id: id,
    name: name,
    any_other_attr_you_need: any_other_attr_you_need
  }
jsn[:modela] = models_a.as_json if models_a.any?
end

#ModelA

def as_json
  jsn = {
    id: id,
    name: name,
    etc: etc
  }
  jsn
end


# Controller
# ...  
def index
  @models_a = ModelA.all
  render json: @models_a.as_json
end
...