站点部分的动态URL生成

时间:2011-04-05 13:24:17

标签: ruby-on-rails ruby-on-rails-3 routes

我正在考虑使用Rails 3 webapp的不同站点部分。站点部分应使用相同的控制器和相同的视图显示相同的资源。

所以http://foo.org/premium/products/1应该提供与http://foo.org/products/1相同的产品(可能会根据部分进行一些修改)。

为了处理,我考虑以某种方式重写URL(可能在routes.rb中,在Rack级别或服务器级别),以便http://foo.org/premium/products/1变为http://foo.org/products/1?section=premium。有没有更好的解决方案呢?

但我看到的真正问题是在生成这些网站的链接时应该保留该部分。例如。网站http://foo.org/premium/products/1上指向ID为2的产品的链接应为http://foo.org/premium/products/2,而不是http://foo.org/products/2?section=premium

不幸的是,这并不像link_to那样微不足道,* _path不知道这些部分。我也想让它变得高度动态,这样我就可以轻松地添加和删除部分,而不会触及静态路由。

我考虑过在link_to生成网址后重写网址。这会是一个好方法吗?还有其他建议吗?

3 个答案:

答案 0 :(得分:1)

如果路线之间的唯一区别是添加premium那么那将是namespace approach

答案 1 :(得分:1)

你可以使用命名空间(如@jpx777所说),你的项目结构应如下所示:

app/
+controllers/
++premium/
+++products_controller.rb
++products_controller.rb
+views/
++premium/
+++products/
++++...(premium product related views)
++products/
+++...(product related views)

在您的routes.rb中:

namespace "premium" do
  resources :products
end
resources :products

答案 2 :(得分:0)

最后,我选择了重写URL的方法,因为这些网站部分之间只有很小的变化(例如另一个背景)。这样我就可以重用所有MVC类,而不是在使用例如路由命名空间时创建新东西。

为了重写URL我使用Rack中间件。所有传入的URL都由rack-rewrite重写。响应主体的链接由另一个自定义中间件重写(类似于Railscasts transcript中所做的那样。

因此/premium/products/1之类的网址最终会以/products/1?section=premium结尾(反之亦然)。