1

这是我的场景

  • 我有一个作为资源路由的瓶子模型
  • 我有一个子域“foo”

我的要求如下

  • 通过 html 格式对 /bottles/* 的任何带有“www”或没有子域的请求应重定向到/bottles/*whatever 到“sub”子域

  • 通过 html 格式对“foo”子域发出的请求/bottles/*whatever应该直接转到 /bottles/*whatever 而无需任何重定向

  • 任何/bottles/*whatever通过 json 格式发出的带有“www”或没有子域的请求都应该直接转到 /bottles/*whatever,而无需任何重定向

  • 通过 json 格式对“foo”子域发出的请求/bottles/*whatever应该直接转到 /bottles/*whatever 而无需任何重定向

这是我的路线.rb

scope :constraints => lambda{|req| ((req.subdomain =="" || req.subdomain=="www") && req.format == "html") } do
    match "/bottles/*whatever" => redirect{|p,req| URI.parse(req.url).tap { |x| x.host = "foo.#{x.host}" }.to_s}
    match "/bottles/" => redirect{|p,req| URI.parse(req.url).tap { |x| x.host = "foo.#{x.host}" }.to_s} 
  end

resources :bottles

重定向部分受到约束,以确保我们仅在具有“”或“Www”子域且格式为 html 时才进行重定向,否则直接使用resources :bottles.

以上在以下情况下完美运行

  • me.com/bottles/*whatever withhtml被重定向到sub.me.com/bottles/*whatever
  • sub.me.com/bottles/*whatever用html直接路由到sub.me.com/bottles/*whatever
  • sub.me.com/bottles/*whatever用json直接路由到sub.me.com/bottles/*whatever

但在以下情况下失败

  • me.com/bottles/*whateverwithjson没有按预期重定向,但它弄乱了我的params/bottles/1应该匹配resource :bottles并带我去bottles#showwith params[:id]=1,但它带我去bottles#showwith params[:whatver] = 1,为什么它将我的id参数放在whatever字段中?当它从未被重定向并且从未匹配约束部分内的路由时..任何想法,下面的一些服务器日志

    在 2012-10-18 15:55:49 +0500 开始 GET "/bottles/1.json" for 127.0.0.1 由 BottlesController#show as JSON 参数处理:{"whatever"=>"1"} 完成 500 内部服务器1ms 内的错误

    ActiveRecord::RecordNotFound(找不到没有 ID 的瓶子):app/controllers/bottles_controller.rb:16:in `show'

4

0 回答 0