2017-04-27 2 views
0

J'implémente friendly_id sur un code source existant. Le scénario est comme ça. Il y a category noms sur la page d'accueil. Lorsque l'utilisateur clique sur l'un de ces liens Catégories, il les amène à une page lorsqu'il a des produits sous cette catégorie. Cette page a une pagination. L'URL précédente avait category_id=number maintenant après la mise en œuvre friendly_id J'ai obtenu l'URL en tant que .L'URL friendly_id ne s'applique pas à la pagination.

Old url:

localhost:3000/search?category_id=208

Nouvelle URL:

localhost:3000/search?category_id=name Cette URL a pagination.

Le problème est lorsque je clique sur la 2ème page sur cette URL, il a toujours la même vieille URL avec le numéro d'identification comme ci-dessous.

localhost:3000/search?category_id=208&page=2

Je sais que je suis manque quelque chose. Quelqu'un pourrait-il me dire comment résoudre ce problème? Voici mon contrôleur. C'est ce qui se passe quand vous essayez d'implémenter de nouvelles choses sur du code existant. Veuillez vérifier la fin de la ligne où il y apour la pagination. Faites-moi savoir si plus d'informations sont nécessaires.

contrôleur

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 

Répondre

1

Si vous utilisez Kaminari, vous devriez avoir quelque chose comme ce qui suit dans votre fichier de vue qui rend les liens page/numéros:

<%= paginate @equipments, params: request.query_parameters.merge(category_id: @category.slug) %> 
0

Je pense au lieu de passer category_id, vous devez passer slug et faire des changements dans la filter() en conséquence

@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) 

Hope that helps!

+0

Dans le modèle, je passe '<% = search_equipments_path (: category_id => category.slug)%>'. Donc, cela fonctionne bien avant de cliquer sur la page suivante. Quand je clique sur la page suivante. Son retour à l'ancienne URL. – user3576036

+0

Si je passe 'params [: category_id] = @ category' juste au dessus de' @ equipments', le friendly_id travaille sur la pagination de catégorie maintenant. Mais pas pour la sous-catégorie. – user3576036

1

Vous pouvez essayer cette intérieur paginate helperparams: request.query_parameter chercher les paramètres de la requête puis vous pouvez définir slug dans cette demande.