Используя RABL (или другой API-конструктор) для создания / обновления модели?
Я сейчас использую RABL для генерации JSON-ответов API в Rails, но я обнаружил, что хотя RABL очень удобен для отображения моделей в ответы, для создания согласованного API мне нужно продублировать эту логику отображения в update
а также create
функции моего контроллера.
В качестве простого примера, если я просто хочу изменить имена атрибутов в ответе на запрос POST, я могу сделать это в RABL:
create.rabl
object @car
attributes car_id: :id, badly_named_legacy_column_that_means_color: :color
Но если я хочу, чтобы клиент мог использовать эти же "очищенные" атрибуты в самом запросе JSON POST/PUT (т.е. иметь возможность отправлять { "id": 1, "color": "red" }
вместо { "car_id": 1, "badly_named_legacy_column_that_means_color": "red" }
), Я должен вручную сделать это отображение снова в контроллере:
cars_controller.rb
def create
params[:car_id] = params.delete(:id)
params[:badly_named_legacy_column_that_means_color] = params.delete(:color)
@car = Car.create(params)
end
Теперь есть два места, которые мне нужно отобразить car_id
в badly_named_legacy_column_that_means_color
, Не очень СУХОЙ.
До сих пор я не нашел способа справиться с этим с помощью RABL. Я скучаю по одному? Я также понимаю, что это может выходить за рамки RABL, который позиционирует себя как систему шаблонов, так что, может быть, есть другой конструктор API, который позволил бы мне сделать это? Мне нравится идея преобразования столбцов грязной базы данных в чистый API, но необходимость указывать это отображение как в представлении, так и в контроллере не очень СУХА. Любые мысли приветствуются.
1 ответ
Обновить
Оригинальный ответ все о Ruby/Rails => JSON, вопрос в JSON => Ruby/Rails. Этот ответ о связывании столбцов должен объяснить подход:
alias_attribute :new_column_name, :column_name_in_db
Тогда вы можете просто ссылаться new_column_name
в RABL и Rails будет обрабатывать ассоциацию при создании / обновлении.
Вы должны быть в состоянии позвонить render
от create
метод и сделать любой вид. Вы можете настроить ответ с create
конкретный шаблон или повторно использовать общий show
шаблон. Хитрость заключается в том, чтобы повторно использовать шаблон объекта Rabl (app/views/car/car.rabl
в этом случае), например:
# POST /cars
def create
@car = Car.new(params)
if @car.save
render action: 'show'
else
respond_with @car
end
end
куда app/views/cars/car.rabl
является
attributes :id, ...
а также app/views/cars/show.rabl
является
object @car
extends "cars/car"