diff --git a/actionpack/lib/action_controller/metal/request_forgery_protection.rb b/actionpack/lib/action_controller/metal/request_forgery_protection.rb index f0ff04a4b798105ffd1e5d54caf28e692feaa26c..f06e14a7ea9ce0bd9651cf4ca8631789771220f1 100644 --- a/actionpack/lib/action_controller/metal/request_forgery_protection.rb +++ b/actionpack/lib/action_controller/metal/request_forgery_protection.rb @@ -282,7 +282,7 @@ def marked_for_same_origin_verification? # :doc: # Check for cross-origin JavaScript responses. def non_xhr_javascript_response? # :doc: - %r(\A(?:text|application)/javascript).match?(media_type) && !request.xhr? + media_type && %r(\A(?:text|application)/javascript).match?(media_type) && !request.xhr? end AUTHENTICITY_TOKEN_LENGTH = 32 diff --git a/actionpack/lib/action_dispatch/http/mime_type.rb b/actionpack/lib/action_dispatch/http/mime_type.rb index 88b3a932116d4a9bd99200c891f743305f404aab..604ad55c0265d1b86d6ccee2d43eed1ae2d5bb16 100644 --- a/actionpack/lib/action_dispatch/http/mime_type.rb +++ b/actionpack/lib/action_dispatch/http/mime_type.rb @@ -231,7 +231,7 @@ def unregister(symbol) class InvalidMimeType < StandardError; end def initialize(string, symbol = nil, synonyms = []) - unless MIME_REGEXP.match?(string) + if string.nil? || ! MIME_REGEXP.match?(string) raise InvalidMimeType, "#{string.inspect} is not a valid MIME type" end @symbol, @synonyms = symbol, synonyms diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb index 44f23940d315e4716b0feab72ae499e15967ec18..102bb65c9706459e0a68940772bd255797a780a2 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -264,7 +264,8 @@ def content_length # (case-insensitive), which may need to be manually added depending on the # choice of JavaScript libraries and frameworks. def xml_http_request? - get_header("HTTP_X_REQUESTED_WITH") =~ /XMLHttpRequest/i + header = get_header("HTTP_X_REQUESTED_WITH") + header && /XMLHttpRequest/i.match?(header) end alias :xhr? :xml_http_request? diff --git a/actionpack/lib/action_dispatch/journey/formatter.rb b/actionpack/lib/action_dispatch/journey/formatter.rb index 53c404ee7c8227f322c6646e73e77771e27c70a4..8a7aeb00151077768f7a905fac686966fbaf50f0 100644 --- a/actionpack/lib/action_dispatch/journey/formatter.rb +++ b/actionpack/lib/action_dispatch/journey/formatter.rb @@ -152,7 +152,7 @@ def missing_keys(route, parts) missing_keys << key end else - unless /\A#{tests[key]}\Z/ === parts[key] + if parts[key].nil? || !/\A#{tests[key]}\Z/.match?(parts[key]) missing_keys ||= [] missing_keys << key end diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 57f9ad9b74f3608071f24e42379ab98c44ecc96b..a750d2057d143c4d617616d55605cd547447085c 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -341,7 +341,7 @@ def check_part(name, part, path_params, hash) end def split_to(to) - if /#/.match?(to) + if to && /#/.match?(to) to.split("#") else [] @@ -350,7 +350,7 @@ def split_to(to) def add_controller_module(controller, modyoule) if modyoule && !controller.is_a?(Regexp) - if %r{\A/}.match?(controller) + if controller && controller.start_with?("/") controller[1..-1] else [modyoule, controller].compact.join("/") diff --git a/actionview/lib/action_view/layouts.rb b/actionview/lib/action_view/layouts.rb index 08f66bf4351685b43fec0d4f16fed545802b91d1..d96d8d359c5952add8836cedac66f2bd522c5353 100644 --- a/actionview/lib/action_view/layouts.rb +++ b/actionview/lib/action_view/layouts.rb @@ -281,7 +281,11 @@ def layout(layout, conditions = {}) def _write_layout_method # :nodoc: silence_redefinition_of_method(:_layout) - prefixes = /\blayouts/.match?(_implied_layout_name) ? [] : ["layouts"] + prefixes = if _implied_layout_name && /\blayouts/.match?(_implied_layout_name) + [] + else + ["layouts"] + end default_behavior = "lookup_context.find_all('#{_implied_layout_name}', #{prefixes.inspect}, false, [], { formats: formats }).first || super" name_clause = if name default_behavior diff --git a/activemodel/test/validators/email_validator.rb b/activemodel/test/validators/email_validator.rb index 0c634d8659063eca6073a0aebd7360d5473003f0..c279398cdad22b41322d0bd63c82adda4121bb7b 100644 --- a/activemodel/test/validators/email_validator.rb +++ b/activemodel/test/validators/email_validator.rb @@ -2,7 +2,8 @@ class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) - record.errors[attribute] << (options[:message] || "is not an email") unless - /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) + if value.nil? || ! /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) + record.errors[attribute] << (options[:message] || "is not an email") + end end end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 6bccc97690e37bbc3993dd3fda954448e682b907..de6da6e2742c587b05fed5b2367c5bb0ce1962eb 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -85,7 +85,9 @@ class AbstractAdapter set_callback :checkin, :after, :enable_lazy_transactions! def self.type_cast_config_to_integer(config) - if config.is_a?(Integer) + if config.nil? + config + elsif config.is_a?(Integer) config elsif SIMPLE_INT.match?(config) config.to_i diff --git a/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb index 25a1fb234a53ac636273bba9338753c957b44d0c..abe8a84ba2dce0162f808bfdc544fb2ec760ee24 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb @@ -162,7 +162,7 @@ def new_column_from_field(table_name, field) type_metadata = fetch_type_metadata(field[:Type], field[:Extra]) default, default_function = field[:Default], nil - if type_metadata.type == :datetime && /\ACURRENT_TIMESTAMP(?:\([0-6]?\))?\z/i.match?(default) + if type_metadata.type == :datetime && default && /\ACURRENT_TIMESTAMP(?:\([0-6]?\))?\z/i.match?(default) default, default_function = nil, default elsif type_metadata.extra == "DEFAULT_GENERATED" default = +"(#{default})" unless default.start_with?("(") diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index dc8c25e02ca6df3af67232e39e5dec6822616605..2d0075151c86bf9808d730ec6652310ce6fc2732 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -617,7 +617,7 @@ def extract_default_function(default_value, default) end def has_default_function?(default_value, default) - !default_value && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP}.match?(default) + !default_value && default && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP}.match?(default) end def load_additional_types(oids = nil)