From 8835f9eba1c7a987309955e8130711309bde73f2 Mon Sep 17 00:00:00 2001 From: William Porter Date: Mon, 21 Mar 2016 17:34:31 +1100 Subject: [PATCH 1/6] Fixes #18: by including a reference to a collections parent_id if present --- lib/active_admin_csv_import/dsl.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index 138538c..ffb73f8 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -31,12 +31,13 @@ def csv_importable(options = {}) collection_action :import_csv do @columns = columns @required_columns = required_columns + @collection_path = parent ? collection_path(params.slice("#{parent.class.name.downcase}_id")) : collection_path @post_path = options[:path].try(:call) - @post_path ||= collection_path + '/import_rows' + @post_path ||= @collection_path + '/import_rows' @redirect_path = options[:redirect_path].try(:call) - @redirect_path ||= collection_path + @redirect_path ||= @collection_path @delimiter = options[:delimiter] From 3e0d6c3207ee0641737b658c87a674516065f908 Mon Sep 17 00:00:00 2001 From: William Porter Date: Mon, 21 Mar 2016 17:47:01 +1100 Subject: [PATCH 2/6] Use underscore instead of downcase as downcase doesn't take into account camelcased classes. --- lib/active_admin_csv_import/dsl.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index ffb73f8..8884919 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -31,7 +31,7 @@ def csv_importable(options = {}) collection_action :import_csv do @columns = columns @required_columns = required_columns - @collection_path = parent ? collection_path(params.slice("#{parent.class.name.downcase}_id")) : collection_path + @collection_path = parent ? collection_path(params.slice("#{parent.class.name.underscore}_id")) : collection_path @post_path = options[:path].try(:call) @post_path ||= @collection_path + '/import_rows' From fcde770b013e2833f1c26630cb1d5894c1929dd5 Mon Sep 17 00:00:00 2001 From: William Porter Date: Tue, 22 Mar 2016 13:45:45 +1100 Subject: [PATCH 3/6] slice for some reason was returning mal formed paths eg. /admin/parent/:parent_id/child.parent_id/import_csv explicitly requiring the parents id seems to fix it --- lib/active_admin_csv_import/dsl.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index ffb73f8..f12afe0 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -31,7 +31,7 @@ def csv_importable(options = {}) collection_action :import_csv do @columns = columns @required_columns = required_columns - @collection_path = parent ? collection_path(params.slice("#{parent.class.name.downcase}_id")) : collection_path + @collection_path = parent ? collection_path({"#{parent.class.name.underscore}_id" => parent.id}) : collection_path @post_path = options[:path].try(:call) @post_path ||= @collection_path + '/import_rows' From 6dc017f095effc43a13a805cf0e9880807ed1ea2 Mon Sep 17 00:00:00 2001 From: William Porter Date: Tue, 22 Mar 2016 13:46:36 +1100 Subject: [PATCH 4/6] Build resource through the association chain rather than just on the resource Class. This way admin resources they use belongs_to relations can build through the parent chain --- lib/active_admin_csv_import/dsl.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index f12afe0..46af2fa 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -54,7 +54,7 @@ def csv_importable(options = {}) row_number = row_params.delete('_row') resource = existing_row_resource(options[:import_unique_key], row_params) - resource ||= active_admin_config.resource_class.new + resource ||= build_row_resource unless update_row_resource(resource, row_params) @failures << { @@ -88,6 +88,10 @@ def update_row_resource(resource, params) resource.save end + def build_row_resource + end_of_association_chain.new + end + def existing_row_resource(lookup_column, params) return unless lookup_column From 3ba741946d90ec4c6e6e0bd17af9ea0402961d14 Mon Sep 17 00:00:00 2001 From: William Porter Date: Tue, 22 Mar 2016 13:47:20 +1100 Subject: [PATCH 5/6] Add controller before_create method. Because running controller callbacks aren't supported we needed a way to tap the resource before it was saved. --- lib/active_admin_csv_import/dsl.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index 46af2fa..7d6c88f 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -56,6 +56,9 @@ def csv_importable(options = {}) resource = existing_row_resource(options[:import_unique_key], row_params) resource ||= build_row_resource + # controller before create callback + resource = before_create(resource) if respond_to? :before_create + unless update_row_resource(resource, row_params) @failures << { row_number: row_number, From f37d7dc2812c641f7a73631e286c48d1d405622a Mon Sep 17 00:00:00 2001 From: William Porter Date: Tue, 22 Mar 2016 14:14:55 +1100 Subject: [PATCH 6/6] Makes more sense to include the before_create callback as part of the build process --- lib/active_admin_csv_import/dsl.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/active_admin_csv_import/dsl.rb b/lib/active_admin_csv_import/dsl.rb index 7d6c88f..7c87f4a 100644 --- a/lib/active_admin_csv_import/dsl.rb +++ b/lib/active_admin_csv_import/dsl.rb @@ -56,9 +56,6 @@ def csv_importable(options = {}) resource = existing_row_resource(options[:import_unique_key], row_params) resource ||= build_row_resource - # controller before create callback - resource = before_create(resource) if respond_to? :before_create - unless update_row_resource(resource, row_params) @failures << { row_number: row_number, @@ -92,7 +89,9 @@ def update_row_resource(resource, params) end def build_row_resource - end_of_association_chain.new + resource = end_of_association_chain.new + # controller before create callback + resource = before_create(resource) if respond_to? :before_create end def existing_row_resource(lookup_column, params)