Comecei a usar jsonapi-resources
gem 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 globalize
gem para traduções de atributos de modelo multilang.
Comecei a usar globalize-accessors
gem 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"
}
]
}
}
}