Extract method do update I18n contents

This way we can test it properly, which will be helpful when fixing
bugs.
This commit is contained in:
Javi Martín
2021-08-06 17:09:29 +02:00
parent e5cd763385
commit bc47d84a1e
3 changed files with 50 additions and 24 deletions

View File

@@ -7,24 +7,7 @@ class Admin::SiteCustomization::InformationTextsController < Admin::SiteCustomiz
end
def update
content_params.each do |content|
values = content[:values].slice(*translation_params)
unless values.empty?
values.each do |key, value|
locale = key.split("_").last
if value == t(content[:id], locale: locale) || value.match(/translation missing/)
next
else
text = I18nContent.find_or_create_by!(key: content[:id])
Globalize.with_locale(locale) do
text.update!(value: value)
end
end
end
end
end
I18nContent.update(content_params, enabled_translations)
redirect_to admin_site_customization_information_texts_path,
notice: t("flash.actions.update.translation")
@@ -48,12 +31,6 @@ class Admin::SiteCustomization::InformationTextsController < Admin::SiteCustomiz
end
end
def translation_params
I18nContent.translated_attribute_names.product(enabled_translations).map do |attr_name, loc|
I18nContent.localized_attr_name_for(attr_name, loc)
end
end
def enabled_translations
params.fetch(:enabled_translations, {}).select { |_, v| v == "1" }.keys
end

View File

@@ -118,4 +118,31 @@ class I18nContent < ApplicationRecord
end.to_h
end
end
def self.update(contents, enabled_translations = I18n.available_locales)
contents.each do |content|
values = content[:values].slice(*translation_params(enabled_translations))
unless values.empty?
values.each do |key, value|
locale = key.split("_").last
if value == I18n.t(content[:id], locale: locale) || value.match(/translation missing/)
next
else
text = I18nContent.find_or_create_by!(key: content[:id])
Globalize.with_locale(locale) do
text.update!(value: value)
end
end
end
end
end
end
def self.translation_params(enabled_translations)
translated_attribute_names.product(enabled_translations).map do |attr_name, loc|
localized_attr_name_for(attr_name, loc)
end
end
end

View File

@@ -133,4 +133,26 @@ RSpec.describe I18nContent, type: :model do
expect(I18nContent.translations_hash(:en)["great"]).to be nil
end
end
describe ".update" do
it "stores new keys with a different translation" do
I18nContent.update([{ id: "shared.yes", values: { "value_en" => "Oh, yeah" }}])
expect(I18nContent.count).to eq 1
expect(I18nContent.first.translations.count).to eq 1
expect(I18nContent.first.value).to eq "Oh, yeah"
end
it "does not store new keys with the default translation" do
I18nContent.update([{ id: "shared.yes", values: { "value_en" => "Yes" }}])
expect(I18nContent.all).to be_empty
end
it "does not store new keys for disabled translations" do
I18nContent.update([{ id: "shared.yes", values: { "value_en" => "Oh, yeah" }}], [:es])
expect(I18nContent.all).to be_empty
end
end
end