我正在考虑使用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
生成网址后重写网址。这会是一个好方法吗?还有其他建议吗?
答案 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
结尾(反之亦然)。