diff --git a/lib/enummer/extension.rb b/lib/enummer/extension.rb index 7fe20a6..a48fae4 100644 --- a/lib/enummer/extension.rb +++ b/lib/enummer/extension.rb @@ -38,11 +38,12 @@ def _enummer_build_values(attribute_name, value_names, options) define_method("#{method_name}?") { self[attribute_name].include?(name) } define_method("#{method_name}=") do |new_value| - if new_value - self[attribute_name].push(name) + if ActiveModel::Type::Boolean.new.cast(new_value) + self[attribute_name] += [name] else - self[attribute_name].delete(name) + self[attribute_name] -= [name] end + self[attribute_name].uniq! end define_method("#{method_name}!") do update(attribute_name => self[attribute_name] + [name]) diff --git a/test/enummer_test.rb b/test/enummer_test.rb index ba5bb58..11b3d2a 100644 --- a/test/enummer_test.rb +++ b/test/enummer_test.rb @@ -57,12 +57,20 @@ def setup @user3.read = true assert_equal %i[execute read], @user3.permissions + + @user3.save + + assert_equal %i[execute read].sort, @user3.permissions.sort end test "setting a setter to false removes the value" do @user1.write = false assert_equal %i[read execute], @user1.permissions + + @user1.save + + assert_equal %i[read execute].sort, @user1.permissions.sort end test "setting the attribute with strings adds the values" do @@ -88,6 +96,18 @@ def setup refute @user1.consumes_greens? end + test "update with prefix" do + assert @user1.consumes_cigarettes? + refute @user1.consumes_greens? + @user1.update!(consumes_cigarettes: true) + refute @user1.consumes_greens? + end + + test "recognizes boolean params" do + @user1.update!(ActionController::Parameters.new({"consumes_cigarettes"=>"false"}).permit(:consumes_cigarettes)) + refute @user1.consumes_cigarettes? + end + test "methods respect _suffix" do refute @user1.car_transport? refute @user1.truck_transport?