带有Ember的Active Model序列化器-如何向集合中添加元素

时间:2018-10-04 14:15:48

标签: ember.js ruby-on-rails-5 ember-data

我有2个与HABTM关系关联的模型CountryLanguage。 我使用带有ActiveModelSerializer和Ember JS作为前端的Rails API。 那么如何向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();
    }
}

这将在Rails中调用CountriesController#update操作。 这是我在Rails控制器中反序列化params哈希的方法:

#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 :(得分:0)

我发现可以在关联中添加/删除项目很热。 所以在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中找到有关模式关系的更多信息。