0

我有一条类似“ http://example.com/sites/example.com ” 的路线get "/sites/:domainname", :to => 'controller#action', :constraints => { :domainname => /.*/ }

它一直有效,直到生成缓存页面 public/sites/example.com(而不是 public/sites/example.com.html),此时它要求用户保存一个 .com 文件。我如何将缓存页面保存为,例如 public/sites/example.com.html?或者可能有不同的解决方法。

4

2 回答 2

0

当前的解决方法是在路由中强制使用 html 扩展:

get "/sites/:domainname.html", :to => "sites#show", :as => :site, :constraints => { :domainname => /.*/ }

这导致public/sites/example.com.html被保存在缓存中。

于 2013-04-12T16:02:28.070 回答
0

查看源代码,caches_page自动假定缓存文件的扩展名应该是它在路径包含句点 ( .) 时找到的“扩展名”。这个逻辑实际上是另一种方法,page_cache_file

      def page_cache_file(path, extension)
        name = (path.empty? || path == "/") ? "/index" : URI.parser.unescape(path.chomp('/'))
        unless (name.split('/').last || name).include? '.'
          name << (extension || self.page_cache_extension)
        end
        return name
      end

如果需要,您可能会覆盖此方法以在控制器中稍有不同的操作,或者使用默认的 ActionController::Base 实现。这是一个可能的例子:

  class MyController < ApplicationController
    class << self
      private

      # override the ActionController method
      def page_cache_file(path, extension)
        # use the default logic unless this is a /sites/:domainname request
        # (may need to tweak the regex)
        super unless path =~ %r{/sites/.*}

        # otherwise customize logic to always include the extension
        name = (path.empty? || path == "/") ? "/index" : URI.parser.unescape(path.chomp('/'))
        name << (extension || self.page_cache_extension)
        return name
      end
    end
  end
于 2013-04-12T15:41:12.183 回答