Skip to content

Commit 31a47ed

Browse files
authored
Merge pull request #16 from kryzhovnik/main
Allow adding permitted args on each level of form inheritance
2 parents 52d0cc4 + a36a807 commit 31a47ed

File tree

4 files changed

+18
-5
lines changed

4 files changed

+18
-5
lines changed

lib/active_form_model/permittable.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
# frozen_string_literal: true
22

33
require 'active_support/deprecation'
4+
require 'active_support/core_ext/class/attribute'
45

56
module ActiveFormModel
67
module Permittable
78
extend ActiveSupport::Concern
89

10+
included do
11+
class_attribute(:_permitted_args, instance_predicate: false, default: [])
12+
end
13+
914
class_methods do
1015
def new(attrs = nil, &block)
1116
attrs = _permit_attrs(attrs) if attrs
@@ -14,16 +19,12 @@ def new(attrs = nil, &block)
1419
end
1520

1621
def permit(*args)
17-
@_permitted_args = args
22+
self._permitted_args = _permitted_args | args
1823
end
1924

2025
alias_method :fields, :permit
2126
deprecate fields: :permit, deprecator: ActiveSupport::Deprecation.new('0.6.0', 'ActiveFormModel')
2227

23-
def _permitted_args
24-
@_permitted_args || (superclass.respond_to?(:_permitted_args) && superclass._permitted_args) || []
25-
end
26-
2728
def _permit_attrs(attrs)
2829
attrs.respond_to?(:permit) ? attrs.send(:permit, _permitted_args) : attrs
2930
end

test/active_form_model_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ def test_permitted_attrs_for_assign_attributes
2828
assert { @form.valid_attribute == :one }
2929
end
3030

31+
def test_permitted_attrs_for_inhereted_form
32+
@form = UnsafeUserForm.new(@params)
33+
assert { @form.valid_attribute == :one }
34+
assert { @form.invalid_attribute == :two }
35+
end
36+
3137
# def test_permitted_attrs_for_update!
3238
# @form = UserForm.new
3339
# @form.update!(@params)

test/support/unsafe_user_form.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# frozen_string_literal: true
2+
3+
class UnsafeUserForm < UserForm
4+
permit :invalid_attribute
5+
end

test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
require_relative 'support/user'
1616
require_relative 'support/user_form'
17+
require_relative 'support/unsafe_user_form'
1718
require_relative 'support/admin'
1819
require_relative 'support/admin_form'
1920
require_relative 'support/sign_in_form'

0 commit comments

Comments
 (0)