Rails: шаблон Rabl со структурой модели наследования

Я работаю над проектом, который использует некоторую структуру наследования... Базовый класс..

# /app/models/shape.rb
class Shape < ActiveRecord::Base
  acts_as_superclass # https://github.com/mhuggins/multiple_table_inheritance
end

подкласс - это...

# /app/models/circle.rb
class Circle < ActiveRecord::Base
  inherits_from :shape
end

Вот рисунок, показывающий структуру наследования.

Модель класса

Для этих моделей я пытаюсь создать API с помощью RABL gem. Вот соответствующие контроллеры...

# /app/controllers/api/v1/base_controller.rb
class Api::V1::BaseController < InheritedResources::Base
  load_and_authorize_resource
  respond_to :json, except: [:new, :edit]
end

...

# /app/controllers/api/v1/shapes_controller.rb
class Api::V1::ShapesController < Api::V1::BaseController
  actions :index
  end
end

...

# /app/controllers/api/v1/circles_controller.rb
class Api::V1::CirclesController < Api::V1::BaseController
  def index
    @circles = Circle.all
  end
  def show
    @circle = Circle.find(params[:id])
  end
end

Я создал шаблон show, как было предложено в Railscast #322 Райана Бейтса. Похоже на это...

# /app/views/circles/show.json.rabl
object @circle
attributes :id

Когда я запрашиваю круг через http://localhost:3000/api/v1/circles/1.json, отображается следующее сообщение об ошибке...

Шаблон отсутствует

Отсутствует шаблон api/v1/circles/show, api/v1/base/show, inherited_resources/base/show, application/show с {:locale=>[:en], :formats=>[:html], :handlers= >[:erb, :builder, :arb, :haml, :rabl]}.

Как мне настроить шаблоны для работы с унаследованными ресурсами?


Частичный успех

Я пришел к следующим взглядам. Мне также удалось реализовать структуру наследования моделей, чтобы сохранить код СУХИМ.

# views/api/v1/shapes/index.json.rabl
collection @shapes
extends "api/v1/shapes/show"

...

# views/api/v1/shapes/show.json.rabl
object @place
attributes :id, :area, :circumference

...

# views/api/v1/circles/index.json.rabl
collection @circles
extends "api/v1/circles/show"

...

# views/api/v1/circles/show.json.rabl
object @circle
extends "api/v1/shapes/show"
attributes :radius
if action_name == "show"
  attributes :shapes
end

Это выводит желаемый JSON для кругов (действие index):

# http://localhost:3000/api/v1/cirles.json
[
 {
   "id" : 1,
   "area" : 20,
   "circumference" : 13,
   "radius" : 6
 },
 {
   "id" : 2,
   "area" : 10,
   "circumference" : 4,
   "radius: 3
 }
]

Но по какой-то причине он не выводит связанный shapes со всеми атрибутами...
Примечание. В модели Shape есть ассоциация, о которой я не упоминал ранее.

# http://localhost:3000/api/v1/cirles/1.json
{
  "id" : 1,
  "area" : 20,
  "circumference" : 13,
  "radius" : 6,
  "shapes" : [
    {
      "id" : 2,
      "created_at" : "2013-02-09T12:50:33Z",
      "updated_at" : "2013-02-09T12:50:33Z"
    }
  ]
},

person JJD    schedule 03.02.2013    source источник


Ответы (1)


Согласно предоставленным вами данным, вы положили шаблоны в /app/views/circles. Ошибка говорит вам, что вам нужно поместить их в /app/views/api/v1/circles вместо этого я считаю.

Что касается второго вопроса, похоже, вы говорите, что у каждого круга есть_много связанных фигур. В этом случае я считаю, что что-то вроде следующего должно дать то, что вы хотите для views/api/v1/circles/show.json.rabl:

# views/api/v1/circles/show.json.rabl
object @circle
extends 'api/v1/shapes/show'
attributes :radius
child(:shapes) do
  extends 'api/v1/shapes/show'
end
person cbascom    schedule 10.02.2013
comment
Звучит разумно. Я этого не видел. Я проверю. - person JJD; 11.02.2013
comment
Спасибо за важное решение. Не могли бы вы рискнуть взглянуть на детальную проблему, которую я пытался описать? - person JJD; 11.02.2013
comment
В вашем шаблоне views/api/v1/circles/show.json.rabl есть if action_name == "show", что, как я полагаю, предотвратит отображение атрибутов фигур в действии индекса. - person cbascom; 08.03.2013