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. Вот соответствующие контроллеры...
# /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/circle /show, api/v1/base/show, наследуемые_ресурсы / base / show, приложение / show с {:locale=>[:en],:format =>[: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"
}
]
},
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