- No changes.
- No changes.
-
Return all mappings for a timezone identifier in
country_zonesSome timezones like
Europe/Londonhave multiple mappings inActiveSupport::TimeZone::MAPPINGso return all of them instead of the first one found by usingHash#value. e.g:# Before ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"] # After ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]Fixes #31668.
Andrew White
- No changes.
- No changes.
- No changes.
- No changes.
- No changes.
- No changes.
-
ActiveSupport::EventedFileUpdateCheckerno longer listens to directories outside of the application directory.radiospiel
-
Return unmapped timezones from
country_zonesIf a country doesn't exist in the MAPPINGS hash then create a new
ActiveSupport::Timezoneinstance using the supplied timezone id.Fixes #28431.
Andrew White
-
Fixed bug in
DateAndTime::Compatibility#to_timethat caused it to raiseRuntimeError: can't modify frozen Timewhen called on any frozenTime. Properly pass through the frozenTimeorActiveSupport::TimeWithZoneobject when calling#to_time.Kevin McPhillips & Andrew White
-
Fix inconsistent results when parsing large durations and constructing durations from code
ActiveSupport::Duration.parse('P3Y') == 3.years # It should be trueDuration parsing made independent from any moment of time: Fixed length in seconds is assigned to each duration part during parsing.
Methods on
Numericlike2.daysnow use these predefined durations to avoid duplicating of duration constants through the codebase and eliminate creation of intermediate durations.Andrey Novikov, Andrew White
-
In Core Extensions, make
MarshalWithAutoloading#loadpass through the second, optional argument forMarshal#load( source [, proc] ). This way we don't have to doMarshal.method(:load).super_method.call(sourse, proc)just to be able to pass a proc.Jeff Latz
-
ActiveSupport::Gzip.decompressnow checks checksum and length in footer.Dylan Thacker-Smith
-
Cache
ActiveSupport::TimeWithZone#to_datetimebefore freezing.Adam Rice
- No changes.
- No changes.
-
Ensure duration parsing is consistent across DST changes
Previously
ActiveSupport::Duration.parseusedTime.currentandTime#advanceto calculate the number of seconds in the duration from an arbitrary collection of parts. However asadvancetries to be consistent across DST boundaries this meant that either the duration was shorter or longer depending on the time of year.This was fixed by using an absolute reference point in UTC which isn't subject to DST transitions. An arbitrary date of Jan 1st, 2000 was chosen for no other reason that it seemed appropriate.
Additionally, duration parsing should now be marginally faster as we are no longer creating instances of
ActiveSupport::TimeWithZoneevery time we parse a duration string.Fixes #26941.
Andrew White
-
Fix
DateAndTime::Calculations#copy_time_to. Copynsecinstead ofusec.Jumping forward or backward between weeks now preserves nanosecond digits.
Josua Schmid
-
Avoid bumping the class serial when invoking executor.
Matthew Draper
-
Fix
ActiveSupport::TimeWithZone#inacross DST boundaries.Previously calls to
inwere being sent to the non-DST aware methodTime#sinceviamethod_missing. It is now aliased to the DST awareActiveSupport::TimeWithZone#+which handles transitions across DST boundaries, e.g:Time.zone = "US/Eastern" t = Time.zone.local(2016,11,6,1) # => Sun, 06 Nov 2016 01:00:00 EDT -05:00 t.in(1.hour) # => Sun, 06 Nov 2016 01:00:00 EST -05:00Fixes #26580.
Thomas Balthazar
-
Fix
thread_mattr_accessorsubclass no longer overwrites parent.Assigning a value to a subclass using
thread_mattr_accessorno longer changes the value of the parent class. This brings the behavior inline with the documentation.Given:
class Account thread_mattr_accessor :user end class Customer < Account end Account.user = "DHH" Customer.user = "Rafael"Before:
Account.user # => "Rafael"After:
Account.user # => "DHH"Shinichi Maeshima
-
Since weeks are no longer converted to days, add
:weeksto the list of parts thatActiveSupport::TimeWithZonewill recognize as possibly being of variable duration to take account of DST transitions.Fixes #26039.
Andrew White
-
Fix
ActiveSupport::TimeZone#strptime. Now raisesArgumentErrorwhen the given time doesn't match the format. The error is the same as the one given by Ruby'sDate.strptime. Previously it raisedNoMethodError: undefined method empty? for nil:NilClass.due to a bug.Fixes #25701.
John Gesimondo
-
Support parsing JSON time in ISO8601 local time strings in
ActiveSupport::JSON.decodewhenparse_json_timesis enabled. Strings in the format ofYYYY-MM-DD hh:mm:ss(without aZat the end) will be parsed in the local timezone (Time.zone). In addition, date strings (YYYY-MM-DD) are now parsed intoDateobjects.Grzegorz Witek
-
Date.to_sdoesn't produce too many spaces. For example,to_s(:short)will now produce01 Febinstead of1 Feb.Fixes #25251.
Sean Griffin
-
Rescuable: If a handler doesn't match the exception, check for handlers matching the exception's cause.
Jeremy Daer
-
ActiveSupport::Durationsupports weeks and hours.[1.hour.inspect, 1.hour.value, 1.hour.parts] # => ["3600 seconds", 3600, [[:seconds, 3600]]] # Before # => ["1 hour", 3600, [[:hours, 1]]] # After [1.week.inspect, 1.week.value, 1.week.parts] # => ["7 days", 604800, [[:days, 7]]] # Before # => ["1 week", 604800, [[:weeks, 1]]] # AfterThis brings us into closer conformance with ISO8601 and relieves some astonishment about getting
1.hour.inspect # => 3600 seconds.Compatibility: The duration's
valueremains the same, so apps using durations are oblivious to the new time periods. Apps, libraries, and plugins that work with the internalpartshash will need to broaden their time period handling to cover hours & weeks.Andrey Novikov
-
Time zones: Ensure that the UTC offset reflects DST changes that occurred since the app started. Removes UTC offset caching, reducing performance, but this is still relatively quick and isn't in any hot paths.
Alexey Shein
-
Make
getlocalandgetutcalways return instances ofTimeforActiveSupport::TimeWithZoneandDateTime. This eliminates a possible stack level too deep error into_timewhereActiveSupport::TimeWithZonewas wrapping aDateTimeinstance. As a consequence of this the internal time value inActiveSupport::TimeWithZoneis now always an instance ofTimein the UTC timezone, whether that's as the UTC time directly or a representation of the local time in the timezone. There should be no consequences of this internal change and if there are it's a bug due to leaky abstractions.Andrew White
-
Add
DateTime#subsecto return the fraction of a second as aRational.Andrew White
-
Add additional aliases for
DateTime#utcto mirror the ones onActiveSupport::TimeWithZoneandTime.Andrew White
-
Add
DateTime#localtimeto return an instance ofTimein the system's local timezone. Also aliased togetlocal.Andrew White, Yuichiro Kaneko
-
Add
Time#sec_fractionto return the fraction of a second as aRational.Andrew White
-
Add
ActiveSupport.to_time_preserves_timezoneconfig option to control howto_timehandles timezones. In Ruby 2.4+ the behavior will change from converting to the local system timezone, to preserving the timezone of the receiver. This config option defaults to false so that apps made with earlier versions of Rails are not affected when upgrading, e.g:>> ENV['TZ'] = 'US/Eastern' >> "2016-04-23T10:23:12.000Z".to_time => "2016-04-23T06:23:12.000-04:00" >> ActiveSupport.to_time_preserves_timezone = true >> "2016-04-23T10:23:12.000Z".to_time => "2016-04-23T10:23:12.000Z"Fixes #24617.
Andrew White
-
ActiveSupport::TimeZone.country_zones(country_code)looks up the country's time zones by its two-letter ISO3166 country code, e.g.>> ActiveSupport::TimeZone.country_zones(:jp).map(&:to_s) => ["(GMT+09:00) Osaka"] >> ActiveSupport::TimeZone.country_zones(:uy).map(&:to_s) => ["(GMT-03:00) Montevideo"]Andrey Novikov
-
Array#sumcompat with Ruby 2.4's native method.Ruby 2.4 introduces
Array#sum, but it only supports numeric elements, breaking ourEnumerable#sumwhich supports arbitraryObject#+. To fix, overrideArray#sumwith our compatible implementation.Native Ruby 2.4:
%w[ a b ].sum # => TypeError: String can't be coerced into FixnumWith
Enumerable#sumshim:%w[ a b ].sum # => 'ab'We tried shimming the fast path and falling back to the compatible path if it fails, but that ends up slower even in simple cases due to the cost of exception handling. Our only choice is to override the native
Array#sumwith ourEnumerable#sum.Jeremy Daer
-
ActiveSupport::Durationsupports ISO8601 formatting and parsing.ActiveSupport::Duration.parse('P3Y6M4DT12H30M5S') # => 3 years, 6 months, 4 days, 12 hours, 30 minutes, and 5 seconds (3.years + 3.days).iso8601 # => "P3Y3D"Inspired by Arnau Siches' ISO8601 gem and rewritten by Andrey Novikov with suggestions from Andrew White. Test data from the ISO8601 gem redistributed under MIT license.
(Will be used to support the PostgreSQL interval data type.)
Andrey Novikov, Arnau Siches, Andrew White
-
Cache#fetch(key, force: true)forces a cache miss, so it must be called with a block to provide a new value to cache. Fetching withforce: truebut without a block now raises ArgumentError.cache.fetch('key', force: true) # => ArgumentErrorSantosh Wadghule
-
Fix behavior of JSON encoding for
Exception.namusyaka
-
Make
number_to_phoneformat number with regexp pattern.number_to_phone(18812345678, pattern: /(\d{3})(\d{4})(\d{4})/) # => 188-1234-5678Pan Gaoyong
-
Match
String#to_time's behaviour to that of ruby's implementation for edge cases.nilis now returned instead of the current date if the string provided does contain time information, but none that is used to build theTimeobject.Fixes #22958.
Siim Liiser
-
Rely on the native DateTime#<=> implementation to handle non-datetime like objects instead of returning
nilourselves. This restores the ability ofDateTimeinstances to be compared with aNumericthat represents an astronomical julian day number.Fixes #24228.
Andrew White
-
Add
String#upcase_firstmethod.Glauco Custódio, bogdanvlviv
-
Prevent
Marshal.loadfrom looping infinitely when trying to autoload a constant which resolves to a different name.Olek Janiszewski
-
Deprecate
Module.local_constants. Please useModule.constants(false)instead.Yuichiro Kaneko
-
Publish
ActiveSupport::ExecutorandActiveSupport::ReloaderAPIs to allow components and libraries to manage, and participate in, the execution of application code, and the application reloading process.Matthew Draper
-
Deprecate arguments on
assert_nothing_raised.assert_nothing_raiseddoes not assert the arguments that have been passed in (usually a specific exception class) since the method only yields the block. So as not to confuse the users that the arguments have meaning, they are being deprecated.Tara Scherner de la Fuente
-
Make
benchmark('something', silence: true)actually work.DHH
-
Add
#on_weekday?method toDate,Time, andDateTime.#on_weekday?returnstrueif the receiving date/time does not fall on a Saturday or Sunday.Vipul A M
-
Add
Array#second_to_lastandArray#third_to_lastmethods.Brian Christian
-
Fix regression in
Hash#digfor HashWithIndifferentAccess.Jon Moss
-
Change
number_to_currencybehavior for checking negativity.Used
to_f.negativeinstead of usingto_f.phasefor checking negativity of a number in number_to_currency helper. This change works same for all cases except when number is "-0.0".-0.0.to_f.negative? => false -0.0.to_f.phase? => 3.14This change reverts changes from #6512. But it should be acceptable as we could not find any currency which supports negative zeros.
Prathamesh Sonpatki, Rafael Mendonça França
-
Match
HashWithIndifferentAccess#default's behaviour withHash#default.David Cornu
-
Adds
:exception_objectkey toActiveSupport::Notifications::Instrumenterpayload when an exception is raised.Adds new key/value pair to payload when an exception is raised: e.g.
:exception_object => #<RuntimeError: FAIL>.Ryan T. Hosford
-
Support extended grapheme clusters and UAX 29.
Adam Roben
-
Add petabyte and exabyte numeric conversion.
Akshay Vishnoi
-
Add thread_m/cattr_accessor/reader/writer suite of methods for declaring class and module variables that live per-thread. This makes it easy to declare per-thread globals that are encapsulated. Note: This is a sharp edge. A wild proliferation of globals is A Bad Thing. But like other sharp tools, when it's right, it's right.
Here's an example of a simple event tracking system where the object being tracked needs not pass a creator that it doesn't need itself along:
module Current thread_mattr_accessor :account thread_mattr_accessor :user def self.reset() self.account = self.user = nil end end class ApplicationController < ActionController::Base before_action :set_current after_action { Current.reset } private def set_current Current.account = Account.find(params[:account_id]) Current.user = Current.account.users.find(params[:user_id]) end end class MessagesController < ApplicationController def create @message = Message.create!(message_params) end end class Message < ApplicationRecord has_many :events after_create :track_created private def track_created events.create! origin: self, action: :create end end class Event < ApplicationRecord belongs_to :creator, class_name: 'User' before_validation { self.creator ||= Current.user } endDHH
-
Deprecated
Module#qualified_const_in favour of the builtin Module#const_ methods.Genadi Samokovarov
-
Deprecate passing string to define callback.
Yuichiro Kaneko
-
ActiveSupport::Cache::Store#namespaced_key,ActiveSupport::Cache::MemCachedStore#escape_key, andActiveSupport::Cache::FileStore#key_file_pathare deprecated and replaced withnormalize_keythat now callssuper.ActiveSupport::Cache::LocaleCache#set_cache_valueis deprecated and replaced withwrite_cache_value.Michael Grosser
-
Implements an evented file watcher to asynchronously detect changes in the application source code, routes, locales, etc.
This watcher is disabled by default, applications my enable it in the configuration:
# config/environments/development.rb config.file_watcher = ActiveSupport::EventedFileUpdateCheckerThis feature depends on the listen gem:
group :development do gem 'listen', '~> 3.0.5' endPuneet Agarwal and Xavier Noria
-
Added
Time.days_in_yearto return the number of days in the given year, or the current year if no argument is provided.Jon Pascoe
-
Updated
parameterizeto preserve the case of a string, optionally.Example:
parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth" parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"Swaathi Kakarla
-
HashWithIndifferentAccess.newrespects the default value or proc on objects that respond to#to_hash..new_from_hash_copying_defaultsimply invokes.new. All calls to.new_from_hash_copying_defaultare replaced with.new.Gordon Chan
-
Change Integer#year to return a Fixnum instead of a Float to improve consistency.
Integer#years returned a Float while the rest of the accompanying methods (days, weeks, months, etc.) return a Fixnum.
Before:
1.year # => 31557600.0
After:
1.year # => 31557600
Konstantinos Rousis
-
Handle invalid UTF-8 strings when HTML escaping.
Use
ActiveSupport::Multibyte::Unicode.tidy_bytesto handle invalid UTF-8 strings inERB::Util.unwrapped_html_escapeandERB::Util.html_escape_once. Prevents user-entered input passed from a querystring into a form field from causing invalid byte sequence errors.Grey Baker
-
Update
ActiveSupport::Multibyte::Chars#slice!to returnnilif the arguments are out of bounds, to mirror the behavior ofString#slice!Gourav Tiwari
-
Fix
number_to_humanso that 999999999 rounds to "1 Billion" instead of "1000 Million".Max Jacobson
-
Fix
ActiveSupport::Deprecation#deprecate_methodsto report using the current deprecator instance, where applicable.Brandon Dunne
-
Cache#fetchinstrumentation marks whether it was a:hit.Robin Clowers
-
assert_differenceandassert_no_differencenow returns the result of the yielded block.Example:
post = assert_difference -> { Post.count }, 1 do Post.create end
Lucas Mazza
-
Short-circuit
blank?on date and time values since they are never blank.Fixes #21657.
Andrew White
-
Replaced deprecated
ThreadSafe::Cachewith its successorConcurrent::Mapnow that the thread_safe gem has been merged into concurrent-ruby.Jerry D'Antonio
-
Updated Unicode version to 8.0.0
Anshul Sharma
-
number_to_currencyandnumber_with_delimiternow accept customdelimiter_patternoption to handle placement of delimiter, to support currency formats like INRExample:
number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n") # => '₹ 12,30,000.00'Vipul A M
-
Deprecate
:prefixoption ofnumber_to_human_sizewith no replacement.Jean Boussier
-
Fix
TimeWithZone#eql?to properly handleTimeWithZonecreated fromDateTime: twz = DateTime.now.in_time_zone twz.eql?(twz.dup) => trueFixes #14178.
Roque Pinel
-
ActiveSupport::HashWithIndifferentAccess
selectandrejectwill now return enumerator if called without block.Fixes #20095.
Bernard Potocki
-
Removed
ActiveSupport::Concurrency::Latch, superseded byConcurrent::CountDownLatchfrom the concurrent-ruby gem.Jerry D'Antonio
-
Fix not calling
#defaultonHashWithIndifferentAccess#to_hashwhen onlydefault_procis set, which could raise.Simon Eskildsen
-
Fix setting
default_proconHashWithIndifferentAccess#dup.Simon Eskildsen
-
Fix a range of values for parameters of the Time#change.
Nikolay Kondratyev
-
Add
Enumerable#pluckto get the same values from arrays as from ActiveRecord associations.Fixes #20339.
Kevin Deisz
-
Add a bang version to
ActiveSupport::OrderedOptionsget methods which will raise anKeyErrorif the value is.blank?.Before:
if (slack_url = Rails.application.secrets.slack_url).present? # Do something worthwhile else # Raise as important secret password is not specified endAfter:
slack_url = Rails.application.secrets.slack_url!Aditya Sanghi, Gaurish Sharma
-
Remove deprecated
Class#superclass_delegating_accessor. UseClass#class_attributeinstead.Akshay Vishnoi
-
Patch
Delegatorto work with#try.Fixes #5790.
Nate Smith
-
Add
Integer#positive?andInteger#negative?query methods in the vein ofFixnum#zero?.This makes it nicer to do things like
bunch_of_numbers.select(&:positive?).DHH
-
Encoding
ActiveSupport::TimeWithZoneto YAML now preserves the timezone information.Fixes #9183.
Andrew White
-
Added
ActiveSupport::TimeZone#strptimeto allow parsing times as if from a given timezone.Paul A Jungwirth
-
ActiveSupport::Callbacks#skip_callbacknow raises anArgumentErrorif an unrecognized callback is removed.Iain Beeston
-
Added
ActiveSupport::ArrayInquirerandArray#inquiry.Wrapping an array in an
ArrayInquirergives a friendlier way to check its contents:variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet]) variants.phone? # => true variants.tablet? # => true variants.desktop? # => false variants.any?(:phone, :tablet) # => true variants.any?(:phone, :desktop) # => true variants.any?(:desktop, :watch) # => falseArray#inquiryis a shortcut for wrapping the receiving array in anArrayInquirer.George Claghorn
-
Deprecate
alias_method_chainin favour ofModule#prependintroduced in Ruby 2.0.Kir Shatrov
-
Added
#withoutonEnumerableandArrayto return a copy of an enumerable without the specified elements.Todd Bealmear
-
Fixed a problem where
String#truncate_wordswould get stuck with a complex string.Henrik Nygren
-
Fixed a roundtrip problem with
AS::SafeBufferwhere primitive-like strings will be dumped as primitives:Before:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello" YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1 YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1After:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello" YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true" YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false" YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1" YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"Godfrey Chan
-
Enable
number_to_percentageto keep the number's precision by allowing:precisionto benil.Jack Xu
-
config_accessorbecame a private method, as with Ruby'sattr_accessor.Akira Matsuda
-
AS::Testing::TimeHelpers#travel_tonow changesDateTime.nowas well asTime.nowandDate.today.Yuki Nishijima
-
Add
file_fixturetoActiveSupport::TestCase. It provides a simple mechanism to access sample files in your test cases.By default file fixtures are stored in
test/fixtures/files. This can be configured per test-case using thefile_fixture_pathclass attribute.Yves Senn
-
Return value of yielded block in
File.atomic_write.Ian Ker-Seymer
-
Duplicate frozen array when assigning it to a
HashWithIndifferentAccessso that it doesn't raise aRuntimeErrorwhen callingmap!on it inconvert_value.Fixes #18550.
Aditya Kapoor
-
Add missing time zone definitions for Russian Federation and sync them with
zone.tabfile from tzdata version 2014j (latest).Andrey Novikov
-
Add
SecureRandom.base58for generation of random base58 strings.Matthew Draper, Guillermo Iguaran
-
Add
#prev_dayand#next_daycounterparts to#yesterdayand#tomorrowforDate,Time, andDateTime.George Claghorn
-
Add
same_timeoption to#next_weekand#prev_weekforDate,Time, andDateTime.George Claghorn
-
Add
#on_weekend?,#next_weekday,#prev_weekdaymethods toDate,Time, andDateTime.#on_weekend?returnstrueif the receiving date/time falls on a Saturday or Sunday.#next_weekdayreturns a new date/time representing the next day that does not fall on a Saturday or Sunday.#prev_weekdayreturns a new date/time representing the previous day that does not fall on a Saturday or Sunday.George Claghorn
-
Added ability to
TaggedLoggingto allow loggers to be instantiated multiple times so that they don't share tags with each other.Rails.logger = Logger.new(STDOUT) # Before custom_logger = ActiveSupport::TaggedLogging.new(Rails.logger) custom_logger.push_tags "custom_tag" custom_logger.info "test" # => "[custom_tag] [custom_tag] test" Rails.logger.info "test" # => "[custom_tag] [custom_tag] test" # After custom_logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) custom_logger.push_tags "custom_tag" custom_logger.info "test" # => "[custom_tag] test" Rails.logger.info "test" # => "test"Alexander Staubo
-
Change the default test order from
:sortedto:random.Rafael Mendonça França
-
Remove deprecated
ActiveSupport::JSON::Encoding::CircularReferenceError.Rafael Mendonça França
-
Remove deprecated methods
ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=andActiveSupport::JSON::Encoding.encode_big_decimal_as_string.Rafael Mendonça França
-
Remove deprecated
ActiveSupport::SafeBuffer#prepend.Rafael Mendonça França
-
Remove deprecated methods at
Kernel.silence_stderr,silence_stream,captureandquietly.Rafael Mendonça França
-
Remove deprecated
active_support/core_ext/big_decimal/yaml_conversionsfile.Rafael Mendonça França
-
Remove deprecated methods
ActiveSupport::Cache::Store.instrumentandActiveSupport::Cache::Store.instrument=.Rafael Mendonça França
-
Change the way in which callback chains can be halted.
The preferred method to halt a callback chain from now on is to explicitly
throw(:abort). In the past, callbacks could only be halted by explicitly providing a terminator and by having a callback match the conditions of the terminator. -
Add
ActiveSupport.halt_callback_chains_on_return_falseSetting
ActiveSupport.halt_callback_chains_on_return_falsetotruewill let an app support the deprecated way of halting Active Record, and Active Model callback chains by returningfalse.Setting the value to
falsewill tell the app to ignore anyfalsevalue returned by those callbacks, and only halt the chain uponthrow(:abort).When the configuration option is missing, its value is
true, so older apps ported to Rails 5.0 will not break (but display a deprecation warning). For new Rails 5.0 apps, its value is set tofalsein an initializer, so these apps will support the new behavior by default.claudiob, Roque Pinel
-
Changes arguments and default value of CallbackChain's
:terminatoroptionChains of callbacks defined without an explicit
:terminatoroption will now be halted as soon as abefore_callback throws:abort.Chains of callbacks defined with a
:terminatoroption will maintain their existing behavior of halting as soon as abefore_callback matches the terminator's expectation.claudiob
-
Deprecate
MissingSourceFilein favor ofLoadError.MissingSourceFilewas just an alias toLoadErrorand was not being raised inside the framework.Rafael Mendonça França
-
Remove
Object#itselfas it is implemented in Ruby 2.2.Cristian Bica
-
Add support for error dispatcher classes in
ActiveSupport::Rescuable. Now it acts closer to Ruby's rescue.Example:
class BaseController < ApplicationController module ErrorDispatcher def self.===(other) Exception === other && other.respond_to?(:status) end end rescue_from ErrorDispatcher do |error| render status: error.status, json: { error: error.to_s } end endGenadi Samokovarov
-
Add
#verifiedand#valid_message?methods toActiveSupport::MessageVerifierPreviously, the only way to decode a message with
ActiveSupport::MessageVerifierwas to use#verify, which would raise an exception on invalid messages. Now#verifiedcan also be used, which returnsnilon messages that cannot be decoded.Previously, there was no way to check if a message's format was valid without attempting to decode it.
#valid_message?is a boolean convenience method that checks whether the message is valid without actually decoding it.Logan Leger
Please check 4-2-stable for previous changes.