【问题标题】:Strange routing奇怪的路由
【发布时间】:2011-03-04 04:48:29
【问题描述】:

如何设置我的 rails 应用程序以响应此类网址:

http://mydomain.com/white-halogene-lamp

http://mydomain.com/children-lamps

http://mydomain.com/contact-form

第一个应该链接到我的产品控制器,并用这个名称显示我的产品

第二个应该链接到我的类别控制器,并显示具有此名称的类别

第三个应该链接到我的站点控制器,并显示带有此标题的站点。

所有三个模型(产品、类别、站点)都有一个 to_seo 方法,给出了上面提到的 url(在斜杠之后)

我知道这不是安逸的方式,但请不要在这里讨论,这是不是错误的方式,这不是问题。

问题是如何完成这个奇怪的路由?

我知道我们已经捕获所有路由,但是我如何告诉 Rails 在捕获所有路由的不同 url 上使用不同的控制器?还是您有更好的主意?

我会避免重定向到其他网址。

【问题讨论】:

  • 您只需要应用程序响应 URL 吗? IE,重定向到更合适的 URL 好吗?
  • 不,应该是我用http客户端访问的URL。

标签: ruby-on-rails seo url-routing friendly-url


【解决方案1】:

这有点奇怪,特别是如果重定向是不可能的,但实现此需求的一种方法可能是从您的表中填充路由映射 - routes.rb 只是另一段 ruby​​ 代码,所以如果可以放

map.connect 'children-lamps', :controller => 'category', :action => 'show',  :id => 123

或者你可以在 routes.rb 中定义它的任何其他方式,那么你也可以放

Category.each { |category|
  map.connect category.to_seo, :controller => 'category', :action => 'show', :id => category.id
}

但这只有在您的类别/网站是静态的情况下才有效。

【讨论】:

  • 哇 - 有趣的解决方案。有点讨厌,但同时很酷:)
【解决方案2】:

最好的方法是添加另一个层,然后像这样运行路由:

http://yoursite.com/products/white-halogene-lamp

因为这可以通过:

map.product_seo "prodcuts/:product", :controller => :products, :action => :show

然后在 Products#Show 中将 @product=Product.find(params[:id]) 更改为:

@product=Product.find_by_name(params[:product]) if params[:product] #This assumes name is the field you are searching on
@product=Product.find(params[:id]) unless params[:product]

这样旧路线仍然有效,但您也可以获得 SEO 网址。

类别只需根据需要重复和更改(网址为 /categorys/children-lamps)

对于站点控制器,您确实需要相同的东西,而顶层没有说明您想要什么,您必须手动定义每个路由

【讨论】:

    【解决方案3】:

    您可以为此使用路由约束。

    class ProductExistsConstraint
    
      def matches?(request)
        Product.exists? :slug => request.path_parameters['slug']
      end
    
    end
    

    以及 Category 和 Page 的类似类。然后在路线中

    match ":slug" => "products#show", :constraints => ProductExistsConstraint.new
    match ":slug" => "categories#show", :constraints => CategoryExistsConstraint.new
    match ":slug" => "page#show", :constraints => PageExistsConstraint.new
    

    我没有对此进行测试,但我认为它至少是一个指向正确方向的指针。也可以在这里查看:http://guides.rails.info/routing.html#advanced-constraints

    【讨论】:

      【解决方案4】:

      我不得不做一些非常相似的事情。您可以像这样简单地设置一个通用句柄操作:

      def handle
        @product = Product.find_by_permalink params[:permalink]
        if product
          return render_product
        end
      
        @category - Category.find_by_permalink
        ..
      end
      
      private
      
      def render_product
        # something like this.
        render :file => 'products/show'
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 2014-10-23
        • 2015-10-04
        • 2017-09-01
        • 2016-09-25
        • 2017-08-06
        相关资源
        最近更新 更多