Ruby on rails 基于格式和子域的Rails 3路由约束

Ruby on rails 基于格式和子域的Rails 3路由约束,ruby-on-rails,ruby-on-rails-3,routing,rails-routing,Ruby On Rails,Ruby On Rails 3,Routing,Rails Routing,这是我的设想 我有一个瓶子模型,它是作为资源路由的 我有一个子域名“foo” 我的要求如下 通过html格式向带有“www”或无子域的/blacks/*whatever发出的请求应重定向至/blacks/*whatever至“sub”子域 通过html格式对带有“foo”子域的/blacks/*whatever的请求应直接转到/blacks/*whatever,无需任何重定向 任何通过json格式向/blacks/*whatever发出的带有“www”或无子域的请求应直接转到/blacks

这是我的设想

  • 我有一个瓶子模型,它是作为资源路由的
  • 我有一个子域名“foo”
我的要求如下

  • 通过html格式向带有“www”或无子域的/blacks/*whatever发出的请求应重定向至
    /blacks/*whateve
    r至“sub”子域

  • 通过html格式对带有“foo”子域的
    /blacks/*whatever
    的请求应直接转到/blacks/*whatever,无需任何重定向

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

  • 通过json格式对带有“foo”子域的
    /blacks/*whatever
    的请求应该直接转到/blacks/*whatever,而不需要任何重定向

这是我的路线

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时重定向,否则直接使用
参考资料:瓶子

在以下情况下,上述方法非常有效

  • me.com/labels/*带有
    html的任意内容被重定向到
    sub.me.com/labels/*任意内容
  • sub.me.com/labels/*无论什么
    ,html直接路由到
    sub.me.com/labels/*无论什么
  • sub.me.com/labels/*无论什么
    ,json直接路由到
    sub.me.com/labels/*无论什么
但在以下情况下它失败了

  • me.com/blacks/*任何带有
    json
    都不会按预期重定向,但它会弄乱我的
    参数
    /blacks/1
    应该与
    资源:blacks
    匹配,并将我带到
    瓶#显示
    带有
    参数[:id]=1
    ,但是它需要我使用
    参数[:whatver]=1
    来显示
    瓶子,为什么它会将我的
    id
    参数放在
    任何
    字段中?当它从未被重定向,也从未与约束零件内的路径匹配时。。任何想法,一些服务器日志如下

    2012-10-18 15:55:49+0500开始获取127.0.0.1版本的“/瓶/1.json” 由瓶装控制器处理#显示为JSON 参数:{“whatever”=>“1”} 在1ms内完成500个内部服务器错误

    ActiveRecord::RecordNotFound(找不到没有ID的瓶子): 应用程序/控制器/瓶子/控制器。rb:16:in'show'