diff --git a/actionpack/lib/action_controller/metal/request_forgery_protection.rb b/actionpack/lib/action_controller/metal/request_forgery_protection.rb index 31df6cea0fdc9ed4c61c54b15f18ce8bbf073095..04e575986a693d4ff356bbd41eb81fec486bb775 100644 --- a/actionpack/lib/action_controller/metal/request_forgery_protection.rb +++ b/actionpack/lib/action_controller/metal/request_forgery_protection.rb @@ -280,7 +280,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 60b78c0582a750ade5cdd2b5e16b69dd35a9f9e0..39438193e6446230a190723b904b2facbe8907cd 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 761a6b8206972c55eeb0c5b1d431fe7b0cc382f7..2b8d6057d729c9b482ba2ce97e98716a5df03dc3 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -265,7 +265,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? - /XMLHttpRequest/i.match?(get_header("HTTP_X_REQUESTED_WITH")) + 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 36c041f25474a364d09fc79a960879cdeb5b7190..0bc93ec80b7d80a3b0df6b756b926078659f6b82 100644 --- a/actionpack/lib/action_dispatch/journey/formatter.rb +++ b/actionpack/lib/action_dispatch/journey/formatter.rb @@ -151,7 +151,7 @@ def missing_keys(route, parts) missing_keys << key end else - unless /\A#{tests[key]}\Z/.match?(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 36dc876fc1da63342b6f2ea0e502fbe029261e17..fc1fbfd40ecc8494a1999d30a0a1ce7d7a25252c 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -346,7 +346,7 @@ def check_part(name, part, path_params, hash) end def split_to(to) - if /#/.match?(to) + if to && /#/.match?(to) to.split("#") else [] @@ -355,7 +355,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 b21dc1b9b3a9e3f7f40123cd5868544a047b00b9..09e6cd3886edd1194d241eb0d41c6aeec8aea329 100644 --- a/actionview/lib/action_view/layouts.rb +++ b/actionview/lib/action_view/layouts.rb @@ -280,7 +280,12 @@ 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 774a10b2ba2fc75baa411e7bc938faf4739e2937..5624f4805f14336642b1fb6a3fe71fedde6a32ac 100644 --- a/activemodel/test/validators/email_validator.rb +++ b/activemodel/test/validators/email_validator.rb @@ -2,7 +2,7 @@ class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) - 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.add(attribute, message: options[:message] || "is not an email") 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 9c2b17be1b817fb1a17f8e80723c321f8480123d..b78068a8d33700ae48e09678e5a218fa73c5f1ad 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -47,7 +47,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 90336171036632753ca1e4c62a1dd85ea2b460e5..445a74baf54d331a9dc6dfefdf0d8aae05ae7aa5 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 09cfec9950a7330ad24bab64ce59b7bd86c86a97..ff9c669b962cb3cbd58a9a892091bab839351a41 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -620,7 +620,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)