Permalink
Browse files

update_attribute should not update readonly attributes

[#5106 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information...
1 parent c96a505 commit 992711a86bc4ddd4460f9067e49eea36b37ca94f Neeraj Singh committed with josevalim Jul 18, 2010
@@ -105,6 +105,8 @@ def becomes(klass)
# Updates a single attribute and saves the record without going through the normal validation procedure
# or callbacks. This is especially useful for boolean flags on existing records.
def update_attribute(name, value)
+ raise ActiveRecordError, "#{name.to_s} is marked as readonly" if self.class.readonly_attributes.include? name.to_s
+
changes = record_update_timestamps || {}
if name
@@ -17,13 +17,14 @@
require 'models/minimalistic'
require 'models/warehouse_thing'
require 'models/parrot'
+require 'models/minivan'
require 'models/loose_person'
require 'rexml/document'
require 'active_support/core_ext/exception'
class PersistencesTest < ActiveRecord::TestCase
- fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, 'warehouse-things', :authors, :categorizations, :categories, :posts
+ fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, 'warehouse-things', :authors, :categorizations, :categories, :posts, :minivans
def test_create
topic = Topic.new
@@ -220,6 +221,11 @@ def test_update_attribute
assert !Topic.find(1).approved?
end
+ def test_update_attribute_for_readonly_attribute
+ minivan = Minivan.find('m1')
+ assert_raises(ActiveRecord::ActiveRecordError) { minivan.update_attribute(:color, 'black') }
+ end
+
def test_update_attribute_with_one_changed_and_one_updated
t = Topic.order('id').limit(1).first
title, author_name = t.title, t.author_name
@@ -2,3 +2,4 @@ cool_first:
minivan_id: m1
name: my_minivan
speedometer_id: s1
+ color: blue
@@ -3,4 +3,7 @@ class Minivan < ActiveRecord::Base
belongs_to :speedometer
has_one :dashboard, :through => :speedometer
-end
+
+ attr_readonly :color
+
+end
@@ -300,6 +300,7 @@ def create_table(*args, &block)
t.string :minivan_id
t.string :name
t.string :speedometer_id
+ t.string :color
end
create_table :minimalistics, :force => true do |t|

0 comments on commit 992711a

Please sign in to comment.