Сериализатор Active Model с Ember - как добавить элемент в коллекцию - PullRequest
0 голосов
/ 04 октября 2018

У меня есть 2 модели Country и Language, связанные с отношением HABTM.Я использую Rails API с ActiveModelSerializer и Ember JS в качестве внешнего интерфейса.Так как же можно добавить новую коллекцию language в country.languages?

Со стороны Ember я пытаюсь добавить новый язык следующим образом:

#router

actions: {
saveLanguage(language) {
      let controller = this.get('controller');
      let country = controller.get('aCountry');
      country.get('languages').pushObject(language);
      country.save();
    }
}

Thisвызывает CountriesController#update действие в Rails.Вот как я десериализирую params хэш в контроллере Rails:

#countries_controller.rb

    def country_params
      ActiveModelSerializers::Deserialization.jsonapi_parse!(params)
    end

И вот что он возвращает:

{:code=>"BE", :name=>"BELGIUM", :modified_by=>"XXX", :id=>"5", :language_ids=>["374", "231", "69"]}

Итак, я получаю все, что мне нужно:

country ID => id=5
languages IDS => both existing ones (2) and a new one.

Как правильно обновить страну?Спасибо.

1 Ответ

0 голосов
/ 05 октября 2018

Я разобрался, как добавить / удалить элемент в / из ассоциации.Так что на стороне Ember это выглядит так:

actions: {
    deleteLanguage(language) {
      let controller = this.get('controller');
      let country = controller.get('aCountry');

      country.get('languages').removeObject(language);
      country.set('modifiedBy', this.get('currentUser.user').get('username'))
      country.save();
    },

    saveLanguage(language) {
      let controller = this.get('controller');
      let country = controller.get('aCountry');
      country.get('languages').pushObject(language);
      country.set('modifiedBy', this.get('currentUser.user').get('username'))
      country.save();
    }

А на стороне Rails все происходит в CountriesController:

class CountriesController < ApplicationController
...
def update
      if @country.update(country_params)
        json_response @country
      else
        json_response @country.errors, :unprocessable_entity
      end
    end

    private
    def find_country
      @country = Country.includes(:languages).find(params[:id])
    end

    def country_params
      ActiveModelSerializers::Deserialization.jsonapi_parse!(params,
        only: [
          :id,
          :modified_by,
          :languages
        ])
    end
end

Конечно, мне придется добавить несколько ошибокобработка на Ember стороне только для отображения подтверждения обновления или ошибок.

Метод json_response - это просто мой пользовательский помощник, определенный в concerns для контроллеров следующим образом:

module Response
  def json_response(object, status = :ok, opts = {})
    response = {json: object, status: status}.merge(opts)
    render response
  end
end

Надеюсь, это поможет.Вы можете найти больше о модовых отношениях в Ember Guide .

...