2

我的 routes.rb 文件中有这个:

class SubdomainWww
  def self.matches?(request)  
    request.subdomain.start_with? "www."
  end

  def self.strip_www(subdomain)
    if subdomain.start_with? "www."
      subdomain.slice!(4..-1) 
    else
      subdomain
    end
  end
end

MyApp::Application.routes.draw do

  constraints(SubdomainWww) do
    match '*path', :to => redirect(:subdomain => SubdomainWww.strip_www(???))  
    match '/', :to => redirect(:subdomain => SubdomainWww.strip_www(???))  
  end
...

如果这样做的目的是删除 www。对于子域(例如 www.sub.domain.tld 应重定向到 sub.domain.tld;子域稍后用于识别客户端)。我怎样才能替换'???' 以便将当前请求的子域(字符串)传递给函数 strip_www()?

提前致谢!

4

1 回答 1

0

不知道这是否会起作用或有帮助,但我在使用带有 Devise 的 Cells 时遇到了同样的问题,其中 Devise current_* 方法需要存储在请求中的 env 和warden。我有一条通往单元格(控制器和视图)的路线,它为我呈现了单元格的视图。我将请求发送到单元控制器的方式是将 self 作为来自 route.rb 的请求传递。

match "/dashboard/widget/:name" => proc { |env|
  cell_name = env["action_dispatch.request.path_parameters"][:name]
  [ 200, {}, [ Cell::Base.render_cell_for(cell_name, :display, :request => self) ]]
}

注意 :request => self。当您在路线中时, self 是 ActionDispatch::Request 对象本身。只是传递请求,你应该很好。

MyApp::Application.routes.draw do

  constraints(SubdomainWww) do
    match '*path', :to => redirect(:subdomain => SubdomainWww.strip_www(self))  
    match '/', :to => redirect(:subdomain => SubdomainWww.strip_www(self))  
  end
...
于 2012-04-19T00:10:07.103 回答