我在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()?
提前致谢!
答案 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
...