我有2个与HABTM关系关联的模型Country
和Language
。
我使用带有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.
如何正确更新国家?谢谢。
答案 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中找到有关模式关系的更多信息。