diff options
author | Tejas Dinkar <tejas@gja.in> | 2013-12-02 10:20:43 +0530 |
---|---|---|
committer | Tejas Dinkar <tejas@gja.in> | 2013-12-15 12:13:31 +0530 |
commit | da2b05bb6b713a702eb0420079394bf273f1203e (patch) | |
tree | 854ece5341e6b41f45af5842fef164544a35e3b2 /activemodel | |
parent | fc83efae516fc572551b3f1d67a12394800dd4e2 (diff) | |
download | rails-da2b05bb6b713a702eb0420079394bf273f1203e.tar.gz rails-da2b05bb6b713a702eb0420079394bf273f1203e.tar.bz2 rails-da2b05bb6b713a702eb0420079394bf273f1203e.zip |
Allows you to check if an attribute has changed to a particular value
model.name_changed?(from: "Pete", to: "Ringo")
Diffstat (limited to 'activemodel')
-rw-r--r-- | activemodel/CHANGELOG.md | 6 | ||||
-rw-r--r-- | activemodel/lib/active_model/dirty.rb | 8 | ||||
-rw-r--r-- | activemodel/test/cases/dirty_test.rb | 10 |
3 files changed, 22 insertions, 2 deletions
diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md index 77d1252f1f..42cf58a870 100644 --- a/activemodel/CHANGELOG.md +++ b/activemodel/CHANGELOG.md @@ -1,3 +1,9 @@ +* `attribute_changed?` now accepts parameters which check the old and new value of the attribute + + `model.name_changed?(from: "Pete", to: "Ringo")` + + *Tejas Dinkar* + * Fix `has_secure_password` to honor bcrypt-ruby's cost attribute. *T.J. Schuck* diff --git a/activemodel/lib/active_model/dirty.rb b/activemodel/lib/active_model/dirty.rb index 8ccb25c613..58d87e6f7f 100644 --- a/activemodel/lib/active_model/dirty.rb +++ b/activemodel/lib/active_model/dirty.rb @@ -54,6 +54,7 @@ module ActiveModel # person.name = 'Bob' # person.changed? # => true # person.name_changed? # => true + # person.name_changed?(from: "Uncle Bob", to: "Bob") # => true # person.name_was # => "Uncle Bob" # person.name_change # => ["Uncle Bob", "Bob"] # person.name = 'Bill' @@ -149,8 +150,11 @@ module ActiveModel end # Handle <tt>*_changed?</tt> for +method_missing+. - def attribute_changed?(attr) # :nodoc: - changed_attributes.include?(attr) + def attribute_changed?(attr, options = {}) #:nodoc: + result = changed_attributes.include?(attr) + result &&= options[:to] == __send__(attr) if options.key?(:to) + result &&= options[:from] == changed_attributes[attr] if options.key?(:from) + result end # Handle <tt>*_was</tt> for +method_missing+. diff --git a/activemodel/test/cases/dirty_test.rb b/activemodel/test/cases/dirty_test.rb index a90d0b1299..54427a1513 100644 --- a/activemodel/test/cases/dirty_test.rb +++ b/activemodel/test/cases/dirty_test.rb @@ -67,6 +67,16 @@ class DirtyTest < ActiveModel::TestCase assert_equal [nil, "John"], @model.changes['name'] end + test "checking if an attribute has changed to a particular value" do + @model.name = "Ringo" + assert @model.name_changed?(from: nil, to: "Ringo") + assert_not @model.name_changed?(from: "Pete", to: "Ringo") + assert @model.name_changed?(to: "Ringo") + assert_not @model.name_changed?(to: "Pete") + assert @model.name_changed?(from: nil) + assert_not @model.name_changed?(from: "Pete") + end + test "changes accessible through both strings and symbols" do @model.name = "David" assert_not_nil @model.changes[:name] |