2

我有一个 Rails 3 应用程序,比如酒店,酒店属于父区域。当用户点击应用程序(由 mongrel >> nginx 提供服务)时,我希望请求中使用的域名来决定要服务的酒店区域(域名 >> 区域)。为此,我可以看到两个选项:


1)用nginx重写URL,在域名后面插入区域id(例如birminghamhotels.co.uk => proxy_pass http://myupstream/areas/3 $request_uri)。

好处:域到对象的映射发生在定义接受域的地方:nginx.conf。对用户应该是透明的(可能是漂亮的 URL,因为它们被重写了)。

缺点:打破 Rails url 帮助程序,不再有 link_to 或 form_for。硬编码的对象引用很顽皮。


2)在 routes.rb 中获取域名,并通过每个区域的唯一“域”属性查找区域(如果您愿意,甚至可以使用 has_many)。

优点:应该允许使用所有 Rails URL 助手。请求的域直接链接到资源,因此可以处理异常。

缺点:如果不使用 nginx 重写 URL,用户会不会看到:birminghamhotels.co.uk/areas/3/hotels/42 而不仅仅是 birminghamhotels.co.uk/hotels/42?另外,我不知道该怎么做!


因此,我尝试了选项#1,但遇到了 URL 帮助程序等问题。我试图想出一种尝试选项 #2 的方法,但尽管进行了很多次观察,但仍无法确定正确的语法。现在我无法通过搜索找到任何答案的事实让我认为我得到了这个问题的错误结局。有第三种选择吗?你会怎么解决?

哦,顺便说一句,我没有建立另一个酒店列表网站 - 周围已经有足够多的网站了。恰好是一个足够接近的例子。

4

1 回答 1

1

假设每个区域都有某种 domain_name 字段,看起来您应该能够执行以下操作:

class HotelsController < ApplicationController
  def index
    @hotels = Area.find_by_domain_name(request.subdomains.first).hotels
  end
end

如果您愿意,您甚至可以使用 lambda 将其重构为 named_scope。

于 2010-07-29T22:11:26.357 回答