2017-04-26 2 views
0

J'ai prétendu mes URL en utilisant friendy_id. Mon vieux url regard utilisé comme ci-dessous:Comment rediriger les anciennes URL vers la nouvelle URL générée par friendly_id dans l'application rails?

localhost:3000/search?category_id=208

Maintenant, il ressemble à ceci:

localhost:3000/search?category_id=metal-processing-and-machine-tool

Mon contrôleur est la suivante:

def search_equipments 
    begin 
     if (params.keys & ['category_id', 'sub_category', 'manufacturer', 'country', 'state', 'keyword']).present? 
     if params[:category_id].present? 
      @category = Category.active.friendly.find_by_friendly_id params[:category_id] 
     else 
      @category = Category.active.friendly.find_by_friendly_id params[:sub_category] if params[:sub_category].present? 
     end 
     @root_categories = Category.active.roots 
     @sub_categories = @category.children.active if params[:category_id].present? 
     @sub_categories ||= {} 
     @countries = Country.active.all 
     @manufacturers = Manufacturer.active.all 
     @states = State.active.where("country_id = ?", params[:country]) if params[:country].present? 
     @states ||= {} 
     unless params[:category_id].present? && params[:sub_category].present? 
      params[:category_id] = @category.id if params[:category_id].present? 
      params[:sub_category] = @category.id if params[:sub_category].present? 
     end 
     @equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)).order("#{sort_column} #{sort_direction}, created_at desc").page(params[:page]).per(per_page_items)    
     else 
     redirect_to root_path 
     end 
    rescue Exception => e 
     render :file=>"#{Rails.root}/public/404.html",:status=>404 
    end 

    end 

En ce moment je suis redirigez vieux urls à 404 page. Mais au lieu de cela, j'aimerais que les anciennes URL redirigent vers de nouvelles URL. Comment puis-je atteindre cet objectif? J'ai traversé quelques solutions. Mais ma grande méthode de contrôleur le rend assez complexe pour suivre ces solutions.

Répondre

1

Vous pouvez essayer ceci:

if params[:category_id].present? and params[:category_id].to_s !~ /\D/ 
     category = Category.find_by_id(params[:category_id]) 
     return redirect_to search_equipments_path(request.query_parameters.merge(category_id: category.name.parameterize)) if category.present? 

Si vous avez sous-catégorie, vous pouvez utiliser le même état changeant juste params category à sub-category.

1

Ajouter à votre méthode search_equipments commençant

if params[:category_id].present? and params[:category_id].to_s !~ /\D/ 
     category = Category.find_by_id(params[:category_id]) 
     return redirect_to search_equipments_path(category_id: category.name.parameterize) if category.present? 
    end 
+0

Ajout de la ligne suivante après 'begin'. Mais ça continue à 404 quand on lui donne une vieille URL. – user3576036

+0

non, avant le 'begin', parce que je pourrais faire une faute de frappe, donc il obtient une exception. et c'est une mauvaise habitude d'attraper une exception inconnue, vous devriez vraiment savoir ce qui pourrait arriver. Parfois, laissez-le se produire, de sorte que vous puissiez savoir quel est le problème. –

+0

Okay je l'ai ajouté avant 'begin'. Vous avez mentionné 'search_category_path' dans votre réponse. Je pense que vous vouliez dire 'search_equipments_path' donc je l'ai changé. Quoi qu'il en soit, maintenant, quand je donne l'ancienne URL, il redirige vers la page d'accueil. – user3576036