在routes.rb中访问当前请求?

时间:2012-04-04 21:17:45

标签: ruby-on-rails

我在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()?

提前致谢!

1 个答案:

答案 0 :(得分:0)

不知道这是否有用或有帮助,但我在使用带有Devise的Cell时遇到了同样的问题,其中Devise current_ *方法需要存储在请求中的env和warden。我有一个通往Cell(控制器和视图)的路径,它为我呈现了Cell的视图。我将请求输入Cell控制器的方法是将来自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就是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
...