2011-04-05 34 views
0

我想有一个Rails 3 web应用程序的不同部位的部分。站点部分应使用相同的控制器和相同的视图显示相同的资源。动态URL生成用于网站的栏目

所以http://foo.org/premium/products/1应呈现与http://foo.org/products/1相同的产品(也许根据该部分进行一些修改)。

用于处理我想到莫名其妙地重写URL(也许在routes.rb中,在机架级或服务器级),让http://foo.org/premium/products/1变得http://foo.org/products/1?section=premium。有没有更好的解决方案?

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

可惜事实并非如此微不足道的link_to和* _path不知道的部分。我也希望使这种高度动态的,以便我可以轻松地添加和删除部分,而不接触静态路线。

我想到了他们被link_to产生后重写的URL。这会是一个好方法吗?还有其他建议吗?

回答

0

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

重写我用机架中间件的URL。所有传入的URL都由rack-rewrite重写。响应主体的链接是由其他自定义中间件(像在这个Railscasts transcript完成。

所以像/premium/products/1网址中就会出现如/products/1?section=premium(反之亦然)。

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 
+0

好吧,看来我的问题是没有被改写(我更新它)。命名空间方法使用一个新的控制器和其他视图。我想要的是重用相同的控制器和视图,只是一个别名URL来访问它(和一个选项,以获取控制器内的别名)但我想'link_to'保持当前别名URL。 – Zardoz 2011-04-05 14:27:27

+0

我仍然认为该命名空间是做到这一点的最好办法。您是否担心让事情干?如果是这样的话,你可以在你的视图使用的谐音,创造一个可以包含的模块在每个控制器中。这样你就可以为布局甚至控制器中可能发生的任何必要更改做好准备。否则,每次出现保费和非保费之间的差异时,您都会进行黑客入侵。 – 2011-04-05 14:42:20

+0

是的,这是我在这里看到的一个干燥问题。我必须为每个网站部分使用视图变体,因为我也有不同的路径(例如'premium_products_path','producsts_path')。如果我想重新使用partials或完整的视图,那么我将再次检查我当前的哪个部分,然后用正确的路径调用'link_to'。或者我错过了什么? – Zardoz 2011-04-05 15:18:32