提交 09daaaa1 编写于 作者: A Andrew White

Add support for passing mass assignment roles to dynamic finders. Closes #1170.

上级 1a959ad7
......@@ -264,6 +264,7 @@ def find_by_attributes(match, attributes, *args)
end
def find_or_instantiator_by_attributes(match, attributes, *args)
options = args.size > 1 && args.last(2).all?{ |a| a.is_a?(Hash) } ? args.extract_options! : {}
protected_attributes_for_create, unprotected_attributes_for_create = {}, {}
args.each_with_index do |arg, i|
if arg.is_a?(Hash)
......@@ -278,8 +279,7 @@ def find_or_instantiator_by_attributes(match, attributes, *args)
record = where(conditions).first
unless record
record = @klass.new do |r|
r.assign_attributes(protected_attributes_for_create)
record = @klass.new(protected_attributes_for_create, options) do |r|
r.assign_attributes(unprotected_attributes_for_create, :without_protection => true)
end
yield(record) if block_given?
......
......@@ -239,6 +239,54 @@ def test_protection_against_class_attribute_writers
end
end
def test_find_or_initialize_by_with_attr_accessible_attributes
p = TightPerson.find_or_initialize_by_first_name('Josh', attributes_hash)
assert_default_attributes(p)
end
def test_find_or_initialize_by_with_admin_role_with_attr_accessible_attributes
p = TightPerson.find_or_initialize_by_first_name('Josh', attributes_hash, :as => :admin)
assert_admin_attributes(p)
end
def test_find_or_initialize_by_with_attr_protected_attributes
p = LoosePerson.find_or_initialize_by_first_name('Josh', attributes_hash)
assert_default_attributes(p)
end
def test_find_or_initialize_by_with_admin_role_with_attr_protected_attributes
p = LoosePerson.find_or_initialize_by_first_name('Josh', attributes_hash, :as => :admin)
assert_admin_attributes(p)
end
def test_find_or_create_by_with_attr_accessible_attributes
p = TightPerson.find_or_create_by_first_name('Josh', attributes_hash)
assert_default_attributes(p, true)
end
def test_find_or_create_by_with_admin_role_with_attr_accessible_attributes
p = TightPerson.find_or_create_by_first_name('Josh', attributes_hash, :as => :admin)
assert_admin_attributes(p, true)
end
def test_find_or_create_by_with_attr_protected_attributes
p = LoosePerson.find_or_create_by_first_name('Josh', attributes_hash)
assert_default_attributes(p, true)
end
def test_find_or_create_by_with_admin_role_with_attr_protected_attributes
p = LoosePerson.find_or_create_by_first_name('Josh', attributes_hash, :as => :admin)
assert_admin_attributes(p, true)
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册