JSON API Multilang

Comecei a usar jsonapi-resourcesgem para criar uma API JSON de acordo com o esquema JSON definido por http://jsonapi.org/

Eu encontrei o problema com o suporte a vários idiomas.

Em meu projeto Ruby on Rails, estou usando globalizegem para traduções de atributos de modelo multilang.

Comecei a usar globalize-accessorsgem também, pois eles fornecem getters e setters para campos traduzidos.

Esta é a resposta JSON para

GET /api/v1/pages/8

{
"data": {
"id": "8",
"type": "pages",
"links": {
"self": "/api/v1/pages/8"
},
"attributes": {
"slug": "testing-translations",
"translations": {
"en": {
"title": "Testing Translations",
"body": "<strong>Lorem</strong> ipsum dolor sit amet"
},
"de": {
"title": "Testing Übersetzungen",
"body": null
},
"fr": {
"title": "Essais Traductions",
"body": null
}
}
}
}
}

Eu defini o PageResource como

attributes :slug, :translations

def translations
translations
= {}
Page.globalize_locales.each do |locale|
translations
[locale] = {} unless translations.has_key? locale

translations
[locale]["title"] = @model.send "title_#{locale}"
translations
[locale]["body"] = @model.send "body_#{locale}"
end
translations

end

Isso irá gerar uma saída de relacionamento nivelada.

Para atualizar as traduções da mesma maneira, tive que habilitar as traduções por meio de parâmetros fortes

def page_params
params.require(:data).permit(attributes: [:slug, translations: [:locale, :title, :body]])
end

Como isso vai chamar translations=(data)a instância da página, criei este método:

class Page < ActiveRecord::Base
translates
:title, :body
globalize_accessors


validates
:slug, presence: true

def translations=(data)
data
.each do |o|
self.send("title_#{o[:locale]}=", o[:title]) unless o[:title].blank?
self.send("body_#{o[:locale]}=", o[:body]) unless o[:body].blank?
end

end
end

É isso aí.

De acordo com o esquema, a solicitação PATCH (ou POST) seria:

{
"data": {
"type": "pages",
"attributes": {
"slug": "test-ing",
"translations": [
{
"locale": "en",
"title": "Testing Translations",
"body": "Lorem ipsum dolor sit amet"
},
{
"locale": "de",
"title": "Testing Übersetzungen",
"body": "Einige Blindtext sollte hier gehen"
},
{
"locale": "fr",
"title": "Essais Traductions"
"body": "Certains faux texte devrait aller ici"
}
]
}
}
}