From 383382778c394e2c282e75525a1b972242bcc8f6 Mon Sep 17 00:00:00 2001 From: Ferdi van der Werf Date: Wed, 27 Sep 2023 10:27:25 +0200 Subject: [PATCH 1/3] Fix filter on enum value in list view Filtering on enum (in list view) gave the following error: ``` ActionView::Template::Error (undefined method `[]' for nil:NilClass (bindings[:object] || abstract_model.model.new).send(enum_method) ^^^^^^^^^): 54:
55: <%= form_tag(index_path(params.except(*%w[page f query])), method: :get) do %> 56:
57:
58:
59:
60:
rails_admin (3.1.2) lib/rails_admin/config/fields/types/enum.rb:32:in `block in ' rails_admin (3.1.2) lib/rails_admin/config/configurable.rb:77:in `instance_eval' rails_admin (3.1.2) lib/rails_admin/config/configurable.rb:77:in `block in register_instance_option' rails_admin (3.1.2) lib/rails_admin/config/fields/types/enum.rb:14:in `block in ' rails_admin (3.1.2) lib/rails_admin/config/configurable.rb:77:in `instance_eval' rails_admin (3.1.2) lib/rails_admin/config/configurable.rb:77:in `block in register_instance_option' rails_admin (3.1.2) lib/rails_admin/config/fields/base.rb:106:in `filter_options' ``` This is because bindings is nil and thus the hash lookup fails. By adding safe navigation we circumvent this error and use the second option namely `abstract_model.model.new`. --- lib/rails_admin/config/fields/types/enum.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rails_admin/config/fields/types/enum.rb b/lib/rails_admin/config/fields/types/enum.rb index 961e6ff489..a5c633537e 100644 --- a/lib/rails_admin/config/fields/types/enum.rb +++ b/lib/rails_admin/config/fields/types/enum.rb @@ -28,7 +28,7 @@ class Enum < RailsAdmin::Config::Fields::Base if abstract_model.model.respond_to?(enum_method) abstract_model.model.send(enum_method) else - (bindings[:object] || abstract_model.model.new).send(enum_method) + (bindings&.[](:object) || abstract_model.model.new).send(enum_method) end end From ee60311215f15095532fcad0c37e89542186b3a5 Mon Sep 17 00:00:00 2001 From: Felix Kenton Date: Fri, 7 Jun 2024 17:33:17 +0100 Subject: [PATCH 2/3] Add tests for Fields::Types::Enum#enum when no bindings provided A lack of tests for these code paths led to a regression for legacy enums in Rails Admin 3.0 (https://github.com/railsadminteam/rails_admin/issues/3651). This tests the code path using `abstract_model` that was fixed by @fuegas in the previous commit. --- spec/rails_admin/config/fields/types/enum_spec.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/spec/rails_admin/config/fields/types/enum_spec.rb b/spec/rails_admin/config/fields/types/enum_spec.rb index 6bee0de9b6..457fb43172 100644 --- a/spec/rails_admin/config/fields/types/enum_spec.rb +++ b/spec/rails_admin/config/fields/types/enum_spec.rb @@ -63,10 +63,15 @@ def color_list Team.send(:remove_method, :color_list) end - it 'allows configuration' do + it 'allows configuration by enum_method when bindings provide object' do is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) expect(subject.with(object: Team.new).enum).to eq %w[blue green red] end + + it 'allows configuration by enum_method when no bindings provided' do + is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) + expect(subject.enum).to eq %w[blue green red] + end end describe 'the enum class method' do @@ -87,10 +92,15 @@ def color_list Team.instance_eval { undef :color_list } end - it 'allows configuration' do + it 'allows configuration by enum_method when bindings provide object' do is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) expect(subject.with(object: Team.new).enum).to eq %w[blue green red] end + + it 'allows configuration by enum_method when no bindings provided' do + is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) + expect(subject.enum).to eq %w[blue green red] + end end describe 'when overriding enum configuration' do From 8040966f2983ba724968416dec025f6912d7d1ec Mon Sep 17 00:00:00 2001 From: Felix Kenton Date: Fri, 7 Jun 2024 17:55:51 +0100 Subject: [PATCH 3/3] Fix calls to Fields::Types::Enum#enum_method when no bindings provided Similar to `Fields::Types::Enum#enum` the code path using `abstract_model` was untested and the implementation did not account for the possibility that the `bindings` may be nil. --- lib/rails_admin/config/fields/types/enum.rb | 2 +- spec/rails_admin/config/fields/types/enum_spec.rb | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/rails_admin/config/fields/types/enum.rb b/lib/rails_admin/config/fields/types/enum.rb index a5c633537e..5f05af7ccb 100644 --- a/lib/rails_admin/config/fields/types/enum.rb +++ b/lib/rails_admin/config/fields/types/enum.rb @@ -21,7 +21,7 @@ class Enum < RailsAdmin::Config::Fields::Base end register_instance_option :enum_method do - @enum_method ||= bindings[:object].class.respond_to?("#{name}_enum") || (bindings[:object] || abstract_model.model.new).respond_to?("#{name}_enum") ? "#{name}_enum" : name + @enum_method ||= bindings&.[](:object).class.respond_to?("#{name}_enum") || (bindings&.[](:object) || abstract_model.model.new).respond_to?("#{name}_enum") ? "#{name}_enum" : name end register_instance_option :enum do diff --git a/spec/rails_admin/config/fields/types/enum_spec.rb b/spec/rails_admin/config/fields/types/enum_spec.rb index 457fb43172..3ea169c8a0 100644 --- a/spec/rails_admin/config/fields/types/enum_spec.rb +++ b/spec/rails_admin/config/fields/types/enum_spec.rb @@ -17,11 +17,17 @@ end end - it 'auto-detects enumeration' do + it 'auto-detects enumeration when bindings provide object' do is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) is_expected.not_to be_multiple expect(subject.with(object: Team.new).enum).to eq %w[blue green red] end + + it 'auto-detects enumeration when no bindings provided' do + is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) + is_expected.not_to be_multiple + expect(subject.enum).to eq %w[blue green red] + end end describe "when class responds to '\#{method}_enum'" do @@ -39,10 +45,15 @@ def color_enum end end - it 'auto-detects enumeration' do + it 'auto-detects enumeration when bindings provide object' do is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) expect(subject.with(object: Team.new).enum).to eq %w[blue green red] end + + it 'auto-detects enumeration when no bindings provided' do + is_expected.to be_a(RailsAdmin::Config::Fields::Types::Enum) + expect(subject.enum).to eq %w[blue green red] + end end describe 'the enum instance method' do