Skip to content

Commit c306358

Browse files
authored
Merge pull request rails#44845 from eileencodes/fix-persistence-methods-for-readonly-records
Fix touch and update_column/s for readonly records
2 parents cfa7284 + 0c508ae commit c306358

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

activerecord/lib/active_record/persistence.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,7 @@ def update_column(name, value)
827827
def update_columns(attributes)
828828
raise ActiveRecordError, "cannot update a new record" if new_record?
829829
raise ActiveRecordError, "cannot update a destroyed record" if destroyed?
830+
_raise_readonly_record_error if readonly?
830831

831832
attributes = attributes.transform_keys do |key|
832833
name = key.to_s
@@ -1013,6 +1014,7 @@ def reload(options = nil)
10131014
#
10141015
def touch(*names, time: nil)
10151016
_raise_record_not_touched_error unless persisted?
1017+
_raise_readonly_record_error if readonly?
10161018

10171019
attribute_names = timestamp_attributes_for_update_in_model
10181020
attribute_names |= names.map! do |name|

activerecord/test/cases/readonly_test.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,39 @@ def test_cant_save_readonly_record
3737
assert_equal "Developer is marked as readonly", e.message
3838
end
3939

40+
def test_cant_touch_readonly_record
41+
dev = Developer.find(1)
42+
assert_not_predicate dev, :readonly?
43+
44+
dev.readonly!
45+
assert_predicate dev, :readonly?
46+
47+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.touch }
48+
assert_equal "Developer is marked as readonly", e.message
49+
end
50+
51+
def test_cant_update_column_readonly_record
52+
dev = Developer.find(1)
53+
assert_not_predicate dev, :readonly?
54+
55+
dev.readonly!
56+
assert_predicate dev, :readonly?
57+
58+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.update_column(:name, "New name") }
59+
assert_equal "Developer is marked as readonly", e.message
60+
end
61+
62+
def test_cant_update_columns_readonly_record
63+
dev = Developer.find(1)
64+
assert_not_predicate dev, :readonly?
65+
66+
dev.readonly!
67+
assert_predicate dev, :readonly?
68+
69+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.update_columns(name: "New name") }
70+
assert_equal "Developer is marked as readonly", e.message
71+
end
72+
4073
def test_find_with_readonly_option
4174
Developer.all.each { |d| assert_not d.readonly? }
4275
Developer.readonly(false).each { |d| assert_not d.readonly? }

0 commit comments

Comments
 (0)