Используя 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"
Другие вопросы по тегам