aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #18670 from morgoth/fix-duplicating-errors-detailsYves Senn2015-01-241-1/+2
|\ | | | | Fixed duplicating ActiveModel::Errors#details
| * Fixed duplicating ActiveModel::Errors#detailsWojciech Wnętrzak2015-01-241-1/+2
| |
* | use attribute assignment module logic during active model initializationEugene Gilburg2015-01-231-4/+3
|/
* ✂️ and 💅 for #10776Sean Griffin2015-01-231-3/+2
| | | | | Minor style changes across the board. Changed an alias to an explicit method declaration, since the alias will not be documented otherwise.
* Extracted `ActiveRecord::AttributeAssignment` to ↵Bogdan Gusiev2015-01-232-0/+65
| | | | | | `ActiveModel::AttributesAssignment` Allows to use it for any object as an includable module.
* Merge pull request #18322 from morgoth/add-error-codesRafael Mendonça França2015-01-211-20/+37
|\ | | | | Add ActiveModel::Errors#codes
| * Add ActiveModel::Errors#detailsWojciech Wnętrzak2015-01-201-20/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To be able to return type of validator, one can now call `details` on Errors instance: ```ruby class User < ActiveRecord::Base validates :name, presence: true end ``` ```ruby user = User.new; user.valid?; user.errors.details => {name: [{error: :blank}]} ```
* | Add missing AS core extension dependencyWojciech Wnętrzak2015-01-211-0/+1
|/
* Don't calculate in-place changes on attribute assignmentSean Griffin2015-01-181-0/+1
| | | | | | | | | | | When an attribute is assigned, we determine if it was already marked as changed so we can determine if we need to clear the changes, or mark it as changed. Since this only affects the `attributes_changed_by_setter` hash, in-place changes are irrelevant to this process. Since calculating in-place changes can be expensive, we can just skip it here. I also added a test for the only edge case I could think of that would be affected by this change.
* Merge pull request #18439 from mokhan/validates-acceptance-of-arraySean Griffin2015-01-121-2/+6
|\ | | | | allow '1' or true for acceptance validation.
| * allow '1' or true for acceptance validation.mo khan2015-01-101-2/+6
| |
* | Fix error messages scope [skip ci]Anton Davydov2015-01-121-2/+2
|/
* Remove attributes_protected_by_default reference, since ↵robertomiranda2015-01-091-7/+0
| | | | MassAssignmentSecurity was removed from ActiveModel f8c9a4d3e88181
* removing unecessary parameter in private methodGeorge Millo2015-01-061-2/+2
| | | | '_singularize' only ever gets called with one argument
* Remove unneeded requiresRafael Mendonça França2015-01-041-1/+0
| | | | These requires were added only to change deprecation message
* Remove deprecated `ActiveModel::Dirty#reset_#{attribute}` and ↵Rafael Mendonça França2015-01-041-20/+0
| | | | `ActiveModel::Dirty#reset_changes`.
* Merge pull request #17227 from claudiob/explicitly-abort-callbacksRafael Mendonça França2015-01-032-5/+3
|\ | | | | | | | | | | | | Introduce explicit way of halting callback chains by throwing :abort. Deprecate current implicit behavior of halting callback chains by returning `false` in apps ported to Rails 5.0. Completely remove that behavior in brand new Rails 5.0 apps. Conflicts: railties/CHANGELOG.md
| * Deprecate `false` as the way to halt AM callbacksclaudiob2015-01-021-2/+1
| | | | | | | | | | | | | | | | | | | | Before this commit, returning `false` in an ActiveModel `before_` callback such as `before_create` would halt the callback chain. After this commit, the behavior is deprecated: will still work until the next release of Rails but will also display a deprecation warning. The preferred way to halt a callback chain is to explicitly `throw(:abort)`.
| * Deprecate `false` as the way to halt AM validation callbacksclaudiob2015-01-021-3/+2
| | | | | | | | | | | | | | | | | | | | Before this commit, returning `false` in an ActiveModel validation callback such as `before_validation` would halt the callback chain. After this commit, the behavior is deprecated: will still work until the next release of Rails but will also display a deprecation warning. The preferred way to halt a callback chain is to explicitly `throw(:abort)`.
| * Throw :abort halts default CallbackChainsclaudiob2015-01-022-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit changes arguments and default value of CallbackChain's :terminator option. After this commit, Chains of callbacks defined **without** an explicit `:terminator` option will be halted as soon as a `before_` callback throws `:abort`. Chains of callbacks defined **with** a `:terminator` option will maintain their existing behavior of halting as soon as a `before_` callback matches the terminator's expectation. For instance, ActiveModel's callbacks will still halt the chain when a `before_` callback returns `false`.
* | Merge branch 'master' of github.com:rails/docrailsVijay Dev2015-01-038-10/+10
|\ \ | |/ |/|
| * Use Active Model, not ActiveModel in plain Englishclaudiob2015-01-028-10/+10
| | | | | | | | | | | | | | Also prevents the word "Model" from linking to the documentation of ActiveModel::Model because that's not intended. [ci skip]
* | Update copyright notices to 2015 [ci skip]Arun Agrawal2014-12-311-1/+1
| |
* | Use more semantic method to check passwordRohit Arondekar2014-12-301-1/+1
| |
* | Don't calculate all in-place changes to determine if attribute_changed?Sean Griffin2014-12-221-1/+5
| | | | | | | | | | | | | | | | | | Calling `changed_attributes` will ultimately check if every mutable attribute has changed in place. Since this gets called whenever an attribute is assigned, it's extremely slow. Instead, we can avoid this calculation until we actually need it. Fixes #18029
* | Fix inaccurate docs in active_model errors [ci skip]Robson Marques2014-12-221-2/+2
|/ | | | | | | | | | | | | | The default value for the argument `message` in `ActiveModel::Errors#add` has a new behavior since ca99ab2481d44d67bc392d0ec1125ff1439e9f94. Before person.errors.add(:name, nil) # => ["is invalid"] After person.errors.add(:name, nil) # => [nil]
* Pass through the `prepend` option to `AS::Callback`Godfrey Chan2014-12-121-1/+1
| | | | | | | | | | | | | I'm not sure what's the use case for this, but apparently it broke some apps. Since it was not the intended result from #16210 I fixed it to not raise an exception anymore. However, I didn't add documentation for it because I don't know if this should be officially supported without knowing how it's meant to be used. In general, validations should be side-effect-free (other than adding to the error message to `@errors`). Order-dependent validations seems like a bad idea. Fixes #18002
* add brackets around attribute_name_tiii2014-12-081-1/+1
| | | | | | since 'attr_name_will_change!' is not an actual method it should be clearer that you have to insert the attribute name as in line 104 [ci skip]
* Correctly handle multiple attribute method prefix/suffixes which matchSean Griffin2014-12-041-6/+4
| | | | | | | | | Active Record defines `attribute_method_suffix :?`. That suffix will match any predicate method when the lookup occurs in Active Model. This will make it incorrectly decide that `id_changed?` should not exist, because it attempts to determine if the attribute `id_changed` is present, rather than `id` with the `_changed?` suffix. Instead, we will look for any correct match.
* Ensure numericality validations work with mutationSean Griffin2014-12-011-0/+11
| | | | | | | | | | | | | | | | | | | | | The detection of in-place changes caused a weird unexpected issue with numericality validations. That validator (out of necessity) works on the `_before_type_cast` version of the attribute, since on an `:integer` type column, a non-numeric string would type cast to 0. However, strings are mutable, and we changed strings to ensure that the post type cast version of the attribute was a different instance than the before type cast version (so the mutation detection can work properly). Even though strings are the only mutable type for which a numericality validation makes sense, special casing strings would feel like a strange change to make here. Instead, we can make the assumption that for all mutable types, we should work on the post-type-cast version of the attribute, since all cases which would return 0 for non-numeric strings are immutable. Fixes #17852
* Start Rails 5 development :tada:Rafael Mendonça França2014-11-281-3/+3
| | | | | | | We will support only Ruby >= 2.1. But right now we don't accept pull requests with syntax changes to drop support to Ruby 1.9.
* Fixing documentation in JSON#from_jsonNick Veys2014-11-201-4/+4
| | | | | Commit d67b289 introduced a tiny regression in the docs for #from_json, true needs to be included when the root node is present.
* [Enh] Changed the visibility of the ↵Daniele Di Bernardo2014-11-061-1/+1
| | | | | | | | | ActiveModel::Dirty#clear_attribute_changes method In Rails 4.2 it is impossible to define a custom default value for a model's attribute without making it appear as _changed?, especially when the model is first initialized. Making this method publicly visible will allow such a behaviour, without the need to use private APIs.
* add missing space.[ci skip]Kuldeep Aggarwal2014-11-011-1/+1
|
* Prepare for 4.2.0.beta4 releaseGodfrey Chan2014-10-301-1/+1
|
* edit pass over all warningsXavier Noria2014-10-281-2/+10
| | | | | | | | | | | | | | | This patch uniformizes warning messages. I used the most common style already present in the code base: * Capitalize the first word. * End the message with a full stop. * "Rails 5" instead of "Rails 5.0". * Backticks for method names and inline code. Also, converted a few long strings into the new heredoc convention.
* Prefix internal method with _Rafael Mendonça França2014-10-252-2/+2
| | | | This will avoid naming clash with user defined methods
* Add #key? to ActiveModel::ErrorsGarry Shutler2014-10-141-0/+2
| | | | Mirror Ruby's Hash#key?
* Merge pull request #16409 from ↵Zachary Scott2014-10-033-9/+16
|\ | | | | | | | | justinweiss/update_validation_context_documentation Docs: Add a note on custom validation contexts. [ci skip]
| * Add a note on custom validation contexts.Justin Weiss2014-08-053-9/+16
| | | | | | | | | | | | | | | | | | The documentation on `:on` for validations was inconsistent, and most only referenced the `:create` and `:update` contexts. I fixed those to be consistent with the documentation on `AM::Validations.validates`, which seemed to have the best docs. [ci skip]
* | fix typo in in define_model_callbacks comment [ci skip]Ryan Selk2014-10-031-1/+1
| |
* | add notes for `define_model_callbacks` [ci skip]Kuldeep Aggarwal2014-10-031-0/+3
| |
* | Disallow appended newlines when parsing as integerMichael Genereux2014-10-021-1/+1
| | | | | | \Z allows appended newlines where \z does not.
* | Refactor callback setup in to use lambda instead of evalPablo Herrero2014-09-302-3/+5
| |
* | Reduce allocations when running AR callbacks.Pete Higgins2014-09-282-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Inspired by @tenderlove's work in c363fff29f060e6a2effe1e4bb2c4dd4cd805d6e, this reduces the number of strings allocated when running callbacks for ActiveRecord instances. I measured that using this script: ``` require 'objspace' require 'active_record' require 'allocation_tracer' ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:" ActiveRecord::Base.connection.instance_eval do create_table(:articles) { |t| t.string :name } end class Article < ActiveRecord::Base; end a = Article.create name: "foo" a = Article.find a.id N = 10 result = ObjectSpace::AllocationTracer.trace do N.times { Article.find a.id } end result.sort.each do |k,v| p k => v end puts "total: #{result.values.map(&:first).inject(:+)}" ``` When I run this against master and this branch I get this output: ``` pete@balloon:~/projects/rails/activerecord$ git checkout master M Gemfile Switched to branch 'master' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_before pete@balloon:~/projects/rails/activerecord$ git checkout remove-dynamic-send-on-built-in-callbacks M Gemfile Switched to branch 'remove-dynamic-send-on-built-in-callbacks' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_after pete@balloon:~/projects/rails/activerecord$ diff allocations_before allocations_after 39d38 < {["/home/pete/projects/rails/activesupport/lib/active_support/callbacks.rb", 81]=>[40, 0, 0, 0, 0, 0]} 42c41 < total: 630 --- > total: 590 ``` In addition to this, there are two micro-optimizations present: * Using `block.call if block` vs `yield if block_given?` when the block was being captured already. ``` pete@balloon:~/projects$ cat benchmark_block_call_vs_yield.rb require 'benchmark/ips' def block_capture_with_yield &block yield if block_given? end def block_capture_with_call &block block.call if block end def no_block_capture yield if block_given? end Benchmark.ips do |b| b.report("block_capture_with_yield") { block_capture_with_yield } b.report("block_capture_with_call") { block_capture_with_call } b.report("no_block_capture") { no_block_capture } end pete@balloon:~/projects$ ruby benchmark_block_call_vs_yield.rb Calculating ------------------------------------- block_capture_with_yield 124979 i/100ms block_capture_with_call 138340 i/100ms no_block_capture 136827 i/100ms ------------------------------------------------- block_capture_with_yield 5703108.9 (±2.4%) i/s - 28495212 in 4.999368s block_capture_with_call 6840730.5 (±3.6%) i/s - 34169980 in 5.002649s no_block_capture 5821141.4 (±2.8%) i/s - 29144151 in 5.010580s ``` * Defining and calling methods instead of using send. ``` pete@balloon:~/projects$ cat benchmark_method_call_vs_send.rb require 'benchmark/ips' class Foo def tacos nil end end my_foo = Foo.new Benchmark.ips do |b| b.report('send') { my_foo.send('tacos') } b.report('call') { my_foo.tacos } end pete@balloon:~/projects$ ruby benchmark_method_call_vs_send.rb Calculating ------------------------------------- send 97736 i/100ms call 151142 i/100ms ------------------------------------------------- send 2683730.3 (±2.8%) i/s - 13487568 in 5.029763s call 8005963.9 (±2.7%) i/s - 40052630 in 5.006604s ``` The result of this is making typical ActiveRecord operations slightly faster: https://gist.github.com/phiggins/e46e51dcc7edb45b5f98
* | Preparing for 4.2.0.beta2 releaseRafael Mendonça França2014-09-261-1/+1
| |
* | Move the array to a constantGodfrey Chan2014-09-231-3/+4
| |
* | Update error message for validate methodPrathamesh Sonpatki2014-09-201-1/+6
| | | | | | | | | | - Improve the error message by suggesting that the user may have intended to call validates instead of validate method.
* | use `allow_blank` option insteadKuldeep Aggarwal2014-09-141-1/+1
| |
* | Refer to the library name instead of the constantRobin Dupret2014-08-301-1/+1
| | | | | | | | | | | | | | | | | | When we are loading a component and we want to know its version, we are actually not speaking about the constant but the library itself. [ci skip] [Godfrey Chan & Xavier Noria]