From 5398c5a33d06199764a77c396fba103e4454df60 Mon Sep 17 00:00:00 2001 From: Sebastian Gassner Date: Sun, 23 Jun 2013 14:51:08 +0200 Subject: [PATCH 1/3] Register a before_filter in ActionController::Base to a) remove empty unsaved translations from params and b) mark empty saved translations for deletion. --- lib/active_admin/globalize3/engine.rb | 10 ++++ .../globalize3/filter_empty_translations.rb | 48 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 lib/active_admin/globalize3/filter_empty_translations.rb diff --git a/lib/active_admin/globalize3/engine.rb b/lib/active_admin/globalize3/engine.rb index 267b8bd0..04ee875a 100644 --- a/lib/active_admin/globalize3/engine.rb +++ b/lib/active_admin/globalize3/engine.rb @@ -1,3 +1,5 @@ +require 'active_admin/globalize3/filter_empty_translations' + module ActiveAdmin module Globalize3 class Engine < ::Rails::Engine @@ -13,6 +15,14 @@ class Engine < ::Rails::Engine ActiveAdmin.application.register_javascript "active_admin/active_admin_globalize3.js" end + # Register a before_filter in ActionController that will filter out + # empty translations submitted by activeadmin-globalize3. + # See ActiveAdmin::Globalize3::FilterEmptyTranslations#filter_empty_translations + initializer "activeadmin-globalize3.load_helpers" do |app| + ActionController::Base.send :include, ActiveAdmin::Globalize3::FilterEmptyTranslations + ActionController::Base.send :before_filter, :filter_empty_translations, only: [:create, :update] + end + end end end diff --git a/lib/active_admin/globalize3/filter_empty_translations.rb b/lib/active_admin/globalize3/filter_empty_translations.rb new file mode 100644 index 00000000..e240ba50 --- /dev/null +++ b/lib/active_admin/globalize3/filter_empty_translations.rb @@ -0,0 +1,48 @@ +module ActiveAdmin + module Globalize3 + module FilterEmptyTranslations + private + # Activeadmin-globalize3 renders inputs for all translations, + # resulting in many empty translations being created by globalize. + # + # For instance, given the available locales L1, L2 and L2, the + # following params would be submitted on 'create': + # + # { + # : + # MODEL => { + # "translations_attributes" => { + # "0" => { + # "locale"=>"L1", "id" => "", ATTR1 => "", ATTR2 => "", ... + # } + # "1" => { + # "locale"=>"L2", "id" => "", ATTR1 => "", ATTR2 => "", ... + # } + # "2" => { + # "locale"=>"L3", "id" => "", ATTR1 => "", ATTR2 => "", ... + # } + # } + # } + # : + # } + # + # Given these parameters, globalize3 would create a record for every + # possible translation - even empty ones. + # + # This filter removes all empty and unsaved translations from params + # and marks empty and saved translation for deletion. + def filter_empty_translations + model = controller_name.singularize.to_sym + params[model][:translations_attributes].each do |t| + if !(t.last.map { |_, v| v.empty? ? true : false }[2..-1]).include?(false) + if t.last[:id].empty? + params[model][:translations_attributes].delete(t.first) + else + params[model][:translations_attributes][t.first]['_destroy'] = '1' + end + end + end + end + end + end +end From 334c8449ffe198b07b8ed951750df29e17727b4c Mon Sep 17 00:00:00 2001 From: Sebastian Gassner Date: Mon, 24 Jun 2013 15:30:14 +0200 Subject: [PATCH 2/3] Filter only models that actually translate. Devise's Session does not translate, which led to an error in the original implementation. --- lib/active_admin/globalize3/filter_empty_translations.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/active_admin/globalize3/filter_empty_translations.rb b/lib/active_admin/globalize3/filter_empty_translations.rb index e240ba50..acae7d6d 100644 --- a/lib/active_admin/globalize3/filter_empty_translations.rb +++ b/lib/active_admin/globalize3/filter_empty_translations.rb @@ -32,7 +32,11 @@ module FilterEmptyTranslations # This filter removes all empty and unsaved translations from params # and marks empty and saved translation for deletion. def filter_empty_translations - model = controller_name.singularize.to_sym + model_class = controller_name.classify.safe_constantize + if model_class.nil? or not model_class.translates? + return + end + model = controller_name.singularize.to_sym params[model][:translations_attributes].each do |t| if !(t.last.map { |_, v| v.empty? ? true : false }[2..-1]).include?(false) if t.last[:id].empty? From c86b867f04b2fd82a7d4fd388e37820f35ada392 Mon Sep 17 00:00:00 2001 From: Sebastian Gassner Date: Fri, 12 Jul 2013 12:03:37 +0200 Subject: [PATCH 3/3] code clenup use all? instead of mapping to boolean and checking for include? use blank? instead of empty? on translated attributes --- .../globalize3/filter_empty_translations.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/active_admin/globalize3/filter_empty_translations.rb b/lib/active_admin/globalize3/filter_empty_translations.rb index acae7d6d..4c873fe7 100644 --- a/lib/active_admin/globalize3/filter_empty_translations.rb +++ b/lib/active_admin/globalize3/filter_empty_translations.rb @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- module ActiveAdmin module Globalize3 module FilterEmptyTranslations @@ -36,13 +37,13 @@ def filter_empty_translations if model_class.nil? or not model_class.translates? return end - model = controller_name.singularize.to_sym - params[model][:translations_attributes].each do |t| - if !(t.last.map { |_, v| v.empty? ? true : false }[2..-1]).include?(false) - if t.last[:id].empty? - params[model][:translations_attributes].delete(t.first) + model = controller_name.singularize.to_sym + params[model][:translations_attributes].each do |k,v| + if v.values[2..-1].all?(&:blank?) + if v[:id].empty? + params[model][:translations_attributes].delete(k) else - params[model][:translations_attributes][t.first]['_destroy'] = '1' + params[model][:translations_attributes][k]['_destroy'] = '1' end end end