Skip to content

Commit

Permalink
Make empty string to nil conversion behavior configurable
Browse files Browse the repository at this point in the history
By default, empty strings passed into nullable columns get converted to nils.
You can disable that conversion by setting `treat_empty_as_nil false`.
Refs. #2099, Fixes #3172
  • Loading branch information
mshibuya committed Aug 4, 2019
1 parent 1523397 commit 3f9ab1c
Show file tree
Hide file tree
Showing 23 changed files with 140 additions and 78 deletions.
3 changes: 1 addition & 2 deletions lib/rails_admin/config/fields/types/action_text.rb
@@ -1,11 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class ActionText < RailsAdmin::Config::Fields::Types::Text
class ActionText < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
4 changes: 2 additions & 2 deletions lib/rails_admin/config/fields/types/ck_editor.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class CKEditor < RailsAdmin::Config::Fields::Types::Text
class CKEditor < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
4 changes: 2 additions & 2 deletions lib/rails_admin/config/fields/types/code_mirror.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class CodeMirror < RailsAdmin::Config::Fields::Types::Text
class CodeMirror < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
11 changes: 2 additions & 9 deletions lib/rails_admin/config/fields/types/color.rb
@@ -1,19 +1,12 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/string'
require 'rails_admin/config/fields/types/string_like'

module RailsAdmin
module Config
module Fields
module Types
class Color < RailsAdmin::Config::Fields::Types::String
class Color < StringLike
RailsAdmin::Config::Fields::Types.register(self)

register_instance_option :html_attributes do
{
required: required?,
}
end

register_instance_option :pretty_value do
bindings[:view].content_tag :strong, (value.presence || ' - '), style: "color: #{color}"
end
Expand Down
4 changes: 2 additions & 2 deletions lib/rails_admin/config/fields/types/froala.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class Froala < RailsAdmin::Config::Fields::Types::Text
class Froala < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
8 changes: 2 additions & 6 deletions lib/rails_admin/config/fields/types/hidden.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/string_like'

module RailsAdmin
module Config
module Fields
module Types
class Hidden < RailsAdmin::Config::Fields::Base
class Hidden < StringLike
RailsAdmin::Config::Fields::Types.register(self)

register_instance_option :view_helper do
Expand All @@ -22,10 +22,6 @@ class Hidden < RailsAdmin::Config::Fields::Base
def generic_help
false
end

def parse_input(params)
params[name] = params[name].presence if params.key?(name)
end
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/rails_admin/config/fields/types/simple_mde.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class SimpleMDE < RailsAdmin::Config::Fields::Types::Text
class SimpleMDE < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
8 changes: 2 additions & 6 deletions lib/rails_admin/config/fields/types/string.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/string_like'

module RailsAdmin
module Config
module Fields
module Types
class String < RailsAdmin::Config::Fields::Base
class String < StringLike
RailsAdmin::Config::Fields::Types.register(self)

def input_size
Expand Down Expand Up @@ -38,10 +38,6 @@ def generic_help
text
end

def parse_input(params)
params[name] = params[name].presence if params.key?(name)
end

register_instance_option :partial do
:form_field
end
Expand Down
19 changes: 19 additions & 0 deletions lib/rails_admin/config/fields/types/string_like.rb
@@ -0,0 +1,19 @@
require 'rails_admin/config/fields/base'

module RailsAdmin
module Config
module Fields
module Types
class StringLike < RailsAdmin::Config::Fields::Base
register_instance_option :treat_empty_as_nil? do
properties.try(:nullable?)
end

def parse_input(params)
params[name] = params[name].presence if params.key?(name) && treat_empty_as_nil?
end
end
end
end
end
end
8 changes: 2 additions & 6 deletions lib/rails_admin/config/fields/types/text.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/string_like'

module RailsAdmin
module Config
module Fields
module Types
class Text < RailsAdmin::Config::Fields::Base
class Text < StringLike
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand All @@ -16,10 +16,6 @@ class Text < RailsAdmin::Config::Fields::Base
}
end

def parse_input(params)
params[name] = params[name].presence if params.key?(name)
end

register_instance_option :partial do
:form_text
end
Expand Down
4 changes: 2 additions & 2 deletions lib/rails_admin/config/fields/types/wysihtml5.rb
@@ -1,10 +1,10 @@
require 'rails_admin/config/fields/base'
require 'rails_admin/config/fields/types/text'

module RailsAdmin
module Config
module Fields
module Types
class Wysihtml5 < RailsAdmin::Config::Fields::Types::Text
class Wysihtml5 < Text
# Register field type for the type loader
RailsAdmin::Config::Fields::Types.register(self)

Expand Down
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/action_text_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::ActionText do
it_behaves_like 'a generic field type', :action_text_field

it_behaves_like 'a string-ish field type', :action_text_field
it_behaves_like 'a string-like field type', :action_text_field
end if defined?(ActionText)
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/ck_editor_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::CKEditor do
it_behaves_like 'a generic field type', :text_field, :ck_editor

it_behaves_like 'a string-ish field type', :text_field, :ck_editor
it_behaves_like 'a string-like field type', :text_field, :ck_editor
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/code_mirror_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::CodeMirror do
it_behaves_like 'a generic field type', :text_field, :code_mirror

it_behaves_like 'a string-ish field type', :text_field, :code_mirror
it_behaves_like 'a string-like field type', :text_field, :code_mirror
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/color_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::Color do
it_behaves_like 'a generic field type', :string_field, :color

it_behaves_like 'a string-ish field type', :string_field, :color
it_behaves_like 'a string-like field type', :string_field, :color
end
2 changes: 2 additions & 0 deletions spec/rails_admin/config/fields/types/froala_spec.rb
Expand Up @@ -2,4 +2,6 @@

RSpec.describe RailsAdmin::Config::Fields::Types::Froala do
it_behaves_like 'a generic field type', :text_field, :froala

it_behaves_like 'a string-like field type', :text_field, :froala
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/hidden_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::Hidden do
it_behaves_like 'a generic field type', :integer_field, :hidden

it_behaves_like 'a string-ish field type', :string_field, :hidden
it_behaves_like 'a string-like field type', :string_field, :hidden
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/simple_mde_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::SimpleMDE do
it_behaves_like 'a generic field type', :text_field, :simple_mde

it_behaves_like 'a string-ish field type', :text_field, :simple_mde
it_behaves_like 'a string-like field type', :text_field, :simple_mde
end
83 changes: 83 additions & 0 deletions spec/rails_admin/config/fields/types/string_like_spec.rb
@@ -0,0 +1,83 @@
require 'spec_helper'

RSpec.describe RailsAdmin::Config::Fields::Types::StringLike do
describe '#treat_empty_as_nil?', active_record: true do
context 'with a nullable field' do
subject do
RailsAdmin.config('Team').fields.detect do |f|
f.name == :name
end.with(object: Team.new)
end

it 'is true' do
expect(subject.treat_empty_as_nil?).to be true
end
end

context 'with a non-nullable field' do
subject do
RailsAdmin.config('Team').fields.detect do |f|
f.name == :manager
end.with(object: Team.new)
end

it 'is false' do
expect(subject.treat_empty_as_nil?).to be false
end
end
end

describe '#parse_input' do
subject do
RailsAdmin.config('FieldTest').fields.detect do |f|
f.name == :string_field
end.with(object: FieldTest.new)
end

context 'with treat_empty_as_nil being true' do
before do
RailsAdmin.config FieldTest do
field :string_field do
treat_empty_as_nil true
end
end
end

context 'when value is empty' do
let(:params) { {string_field: ''} }

it 'makes the value nil' do
subject.parse_input(params)
expect(params.key?(:string_field)).to be true
expect(params[:string_field]).to be nil
end
end

context 'when value does not exist in params' do
let(:params) { {} }

it 'does not touch params' do
subject.parse_input(params)
expect(params.key?(:string_field)).to be false
end
end
end

context 'with treat_empty_as_nil being false' do
before do
RailsAdmin.config FieldTest do
field :string_field do
treat_empty_as_nil false
end
end
end
let(:params) { {string_field: ''} }

it 'keeps the value untouched' do
subject.parse_input(params)
expect(params.key?(:string_field)).to be true
expect(params[:string_field]).to eq ''
end
end
end
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/string_spec.rb
Expand Up @@ -25,5 +25,5 @@

it_behaves_like 'a generic field type', :string_field

it_behaves_like 'a string-ish field type', :text_field
it_behaves_like 'a string-like field type', :string_field
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/text_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::Text do
it_behaves_like 'a generic field type', :text_field

it_behaves_like 'a string-ish field type', :text_field
it_behaves_like 'a string-like field type', :text_field
end
2 changes: 1 addition & 1 deletion spec/rails_admin/config/fields/types/wysihtml5_spec.rb
Expand Up @@ -3,5 +3,5 @@
RSpec.describe RailsAdmin::Config::Fields::Types::Wysihtml5 do
it_behaves_like 'a generic field type', :text_field, :wysihtml5

it_behaves_like 'a string-ish field type', :text_field, :wysihtml5
it_behaves_like 'a string-like field type', :text_field, :wysihtml5
end
38 changes: 8 additions & 30 deletions spec/shared_examples/shared_examples_for_field_types.rb
Expand Up @@ -23,36 +23,14 @@
end
end

RSpec.shared_examples 'a string-ish field type' do |column_name, field_type|
describe '#parse_input' do
before do
RailsAdmin.config FieldTest do
field column_name, field_type
end
end
subject do
RailsAdmin.config('FieldTest').fields.detect do |f|
f.name == column_name
end.with(object: FieldTest.new)
end

context 'when value is empty' do
let(:params) { {column_name => ''} }

it 'makes the value nil' do
subject.parse_input(params)
expect(params.key?(column_name)).to be true
expect(params[column_name]).to be nil
end
end

context 'when value does not exist in params' do
let(:params) { {} }
RSpec.shared_examples 'a string-like field type' do |column_name, _|
subject do
RailsAdmin.config('FieldTest').fields.detect do |f|
f.name == column_name
end.with(object: FieldTest.new)
end

it 'does not touch params' do
subject.parse_input(params)
expect(params.key?(column_name)).to be false
end
end
it 'is a StringLike field' do
expect(subject).to be_a(RailsAdmin::Config::Fields::Types::StringLike)
end
end

0 comments on commit 3f9ab1c

Please sign in to comment.