Не загружать данные по индексным маршрутам только с помощью пользовательских сериализаторов в ActiveModel::Serializers.

Я пытаюсь выяснить для индексного маршрута /recipes в Ember, как я могу не загружать дополнительные данные JSON, которые не нужны для этого конкретного представления, а загружать эти данные в отдельные маршруты рецептов.

Как это работает сейчас, Rails возвращает полезную нагрузку JSON, как я хочу:

/recipes.json

{
  "recipes": [
    {
      "id": 1,
      "title": "Scrambled Eggs"
    }
  ]
}

/recipes/1.json

{
  "steps": [
    {
      "id": 1,
      "substep_ids": [
        1,
        2
      ]
    }
  ],
  "substeps": [
    {
      "id": 1
    },
    {
      "id": 2
    }
  ],
  "recipe": {
    "id": 1,
    "title": "Scrambled Eggs",
    "step_ids": [
      1
    ]
  }
}

Если я перейду к /recipes в своем приложении Ember, оно отобразит

  • Яичница-болтунья
  • Оладьи

Но если я нажму на link-to, я не увижу соответствующие шаги и подшаги, которые будут загружены при запросе API для /recipes/:recipe_id. Если я вручную обновлю эту страницу, данные будут успешно загружены.

Есть ли способ сделать то, что я хочу?

На стороне рельсов:

class RecipesController < ApplicationController

  def index
    @recipes = Recipe.all.includes(steps: [:substeps])
    render json: @recipes, each_serializer: ShortRecipeSerializer
  end

  def show
    @recipe = Recipe.includes(:steps => [:substeps]).find(params[:id])
    render json: @recipe
  end

end

class RecipeSerializer < ActiveModel::Serializer
  embed :ids, include: true

  has_many :steps

  attributes :id, :title
end

class ShortRecipeSerializer < ActiveModel::Serializer
  attributes :id, :title
end

И на стороне Ember:

Recipe = DS.Model.extend
  title: DS.attr('string')
  steps: DS.hasMany('step', {async: true})

Step = DS.Model.extend
  substeps: DS.hasMany('substep', {async: true})
  recipe: DS.belongsTo('recipe')

Substep = DS.Model.extend
  step: DS.belongsTo('step')

Заранее спасибо!


person Josh Smith    schedule 05.06.2014    source источник


Ответы (1)


Я думаю, что это сработает, извините, мой кофейный скрипт не очень хорош, но вот некоторый javascript, и он использует Ember App Kit:

var RecipeIndexRoute = Ember.Route.extend({
    model: function(params) {
        return this.store.find('recipe', this.modelFor('recipe').id);
    },
    setupController: function(controller, model) {
        this._super(controller, model);
        model.reload();
    }
});

export default RecipeIndexRoute;

Это должно заставить его сделать запрос к вашему API в конечной точке recipe/:recipe_id.

person Eugene Lee    schedule 05.06.2014
comment
Отличный ответ. Единственное, что я бы изменил, это return this.store.find('recipe', params.recipe_id), и для меня это было бы просто RecipeRoute с ember-cli. - person Josh Smith; 05.06.2014