diff --git a/actionview/lib/action_view/dependency_tracker.rb b/actionview/lib/action_view/dependency_tracker.rb index b9749bab84..755c791db2 100644 --- a/actionview/lib/action_view/dependency_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker.rb @@ -161,20 +161,18 @@ module ActionView return [] unless @view_paths return [] if wildcard_dependencies.empty? - # Remove trailing "*" - prefixes = wildcard_dependencies.map { |query| query[0..-2] } + # Remove trailing "/*" + prefixes = wildcard_dependencies.map { |query| query[0..-3] } @view_paths.flat_map(&:all_template_paths).uniq.select { |path| - prefixes.any? do |prefix| - path.start_with?(prefix) && !path.index("/", prefix.size) - end - }.sort + prefixes.include?(path.prefix) + }.map(&:to_s).sort end def explicit_dependencies dependencies = source.scan(EXPLICIT_DEPENDENCY).flatten.uniq - wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("*") } + wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") } (explicits + resolve_directories(wildcards)).uniq end diff --git a/actionview/lib/action_view/template/error.rb b/actionview/lib/action_view/template/error.rb index 7a14737df4..8595a2988c 100644 --- a/actionview/lib/action_view/template/error.rb +++ b/actionview/lib/action_view/template/error.rb @@ -97,18 +97,17 @@ module ActionView candidates = @error.paths.flat_map(&:all_template_paths).uniq if @error.partial - candidates = candidates.grep(%r{_[^/]+\z}) + candidates = candidates.select!(&:partial?) else - candidates = candidates.grep_v(%r{_[^/]+\z}) + candidates = candidates.reject!(&:partial?) end # Group by possible prefixes - files_by_dir = candidates.group_by do |x| - File.dirname(x) - end.transform_values do |files| + files_by_dir = candidates.group_by(&:prefix) + files_by_dir.transform_values! do |files| files.map do |file| - # Remove directory - File.basename(file) + # Remove prefix + File.basename(file.to_s) end end diff --git a/actionview/lib/action_view/template/resolver.rb b/actionview/lib/action_view/template/resolver.rb index 24f4a55cc9..e9ce70cef1 100644 --- a/actionview/lib/action_view/template/resolver.rb +++ b/actionview/lib/action_view/template/resolver.rb @@ -197,7 +197,9 @@ module ActionView paths = template_glob("**/*") paths.map do |filename| filename.from(@path.size + 1).remove(/\.[^\/]*\z/) - end.uniq + end.uniq.map do |filename| + TemplatePath.parse(filename) + end end private diff --git a/actionview/lib/action_view/template_path.rb b/actionview/lib/action_view/template_path.rb index 85b45a69df..9963ffd6ad 100644 --- a/actionview/lib/action_view/template_path.rb +++ b/actionview/lib/action_view/template_path.rb @@ -45,5 +45,14 @@ module ActionView @virtual end alias :to_s :to_str + + def hash + @virtual.hash + end + + def eql?(other) + @virtual == other.virtual + end + alias :== :eql? end end