代码之家  ›  专栏  ›  技术社区  ›  astropanic

奇怪路由

  •  2
  • astropanic  · 技术社区  · 14 年前

    如何设置我的Rails应用程序以响应这些URL:

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

    http://mydomain.com/children-lamps

    http://mydomain.com/contact-form

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

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

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

    所有三个模型(产品、类别、站点)都有一个方法来进行搜索引擎优化,给出上面提到的URL(斜线后面)

    我知道这不是休息的方式,但请不要在这里浪费时间,这是不是错误的方法,这不是问题。

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

    我知道我们已经捕获了所有路由,但是我如何才能告诉Rails在捕获所有路由的不同URL上使用不同的控制器?或者你有更好的主意吗?

    我将避免重定向到其他URL。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Arcath    14 年前

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

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

    因为这可以通过以下方式完成:

    map.product_seo "prodcuts/:product", :controller => :products, :action => :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]
    

    这样,旧的路由仍然有效,但你也得到搜索引擎优化网址。

    对于类别,只需根据需要重复和更改(url将是/categorys/children lamps)

    对于站点控制器,您真正需要的是相同的东西,如果没有顶级人员说您想要什么,您必须手动定义每个路由。

        2
  •  3
  •   Peteris    14 年前

    这有点奇怪,尤其是如果重定向是不可能的,但是实现这种需要的一种方法可能是从表中填充路由映射-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
    }
    

    但是,只有当您的类别/站点是静态的时,这才有效。

        3
  •  0
  •   Sven Koschnicke    14 年前

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

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

    以及类似的类别和页面类。然后在路线上

    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
  •  0
  •   Oscar Del Ben    14 年前

    我不得不做一些非常相似的事情。您可以简单地设置一个一般的句柄操作,如下所示:

    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