Rails перенаправляет со старого URL на новый, который использует slug - PullRequest
1 голос
/ 07 ноября 2011

у меня есть эта структура для моих новых URL:

module ApplicationHelper
  def product_path(product)
    unless product.category.nil?
      cat = product.category
      if cat.ancestry_depth.eql?(2)
        product_long_path cat.root, cat.parent, cat, product
      else
        product_short_path cat.parent, cat, product
      end
    end
  end
end

route.rb file

 get "/(*root_id)_(*subcategory_id)_(*category_id)_(*id)" => "products#show", :as => :product_long
  get "/(*root_id)_(*category_id)_(*id)" => "products#show", :as => :product_short

и мое шоу-действие

  def show
    @product = Product.find_by_slug params[:id]
    cat = @product.category

    raise NotFound unless cat.slug.eql?(params[:category_id]) and cat.root.slug.eql?(params[:root_id])
    raise NotFound if cat.ancestry_depth.eql?(2) and !cat.parent.slug.eql?(params[:subcategory_id])
  end

Как мне создать перенаправление для "products/:id", у меня есть продукты с глубиной категории 2 и 3.

1 Ответ

1 голос
/ 07 ноября 2011

Я делаю это самым очевидным способом:
ПродукцияКонтроллер, шоу-акция

@product = Product.find_by_slug params[:id]
if @product.nil?
  @product = Product.find params[:id]
  redirect_to @product.redirect_string and return
end

в модели изделия

  def redirect_string
    if category.ancestry_depth.eql?(2)
      "/#{category.root.slug}_#{category.parent.slug}_#{category.slug}_#{slug}"
    else
      "/#{category.parent.slug}_#{category.slug}_#{slug}"
    end
  end

Но я не уверен, что это самое элегантное решение, поэтому я открыт для других решений.

...