2017-04-14 1 views
1

J'ai une méthode existante à interroger sur certains modèles, où ils interrogent sur la base de category_id et sub_category. Sur la page de destination, il générait l'URL comme ceci localhost:3000/search?category_id=208 et il contenait le résultat basé sur cette catégorie. Et maintenant que j'ai mis en œuvre friendly_id gem je suis capable de générer l'URL comme suit localhost:3000/search?category_id=metal-processing-machine-tool. Mais cela a l'air d'affecter la fonctionnalité de recherche existante car, bien qu'elle affiche l'URL correcte en fonction du paramètre category_id sélectionné, elle n'affiche aucun résultat. D'autres mots demandant ne se passe pas.Comment modifier une requête de recherche existante sur l'application rails après avoir implémenté le slug friendly_id?

Suite est ma fonctionnalité de recherche existante: recherche

def search_equipments 
    begin 
     if (params.keys & ['category_id', 'sub_category', 'manufacturer', 'country', 'state', 'keyword']).present? 
     if params[:category_id].present? 
      @category = Category.active.find params[:category_id] 
     else 
      @category = Category.active.find 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 ||= {} 
     @equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)) 
     else 
     redirect_to root_path 
     end 
    rescue Exception => e 
     redirect_to root_path, :notice => "Something went wrong!" 
    end 
    end 

Voici comment je générer l'URL actuellement.

<%= search_equipments_path(:category_id => category.slug) %> 

Ceci était comme ci-dessous. Au lieu de category.slug, il était category.id et la requête utilisée correctement. Je suis perdu car je n'arrive pas à obtenir le résultat de recherche attendu après l'implémentation de friendly_id. Quelqu'un peut-il dire s'il vous plaît comment puis-je résoudre ce problème?

Mise à jour avec category.rb

class Category < ActiveRecord::Base 

    extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders] 

    enum status: { inactive: 0, active: 1} 
    acts_as_nested_set 

    has_many :equipments, dependent: :destroy 
    has_many :subs_equipments, :foreign_key => "sub_category_id", :class_name => "Equipment" 
    has_many :wanted_equipments, dependent: :destroy 
    has_many :services, dependent: :destroy 

    validates :name, presence: true 
    validates_uniqueness_of :name,message: "Category with this name already exists", scope: :parent_id 
    scope :active, -> { where(status: 1) } 

    def sub_categories 
    Category.where(:parent_id=>self.id) 
    end 

    def should_generate_new_friendly_id? 
    true 
    end 

end 

catégories Table

create_table "categories", force: :cascade do |t| 
    t.string "name",   limit: 255 
    t.integer "parent_id",  limit: 4 
    t.integer "status",   limit: 4, default: 1 
    t.integer "lft",   limit: 4,    null: false 
    t.integer "rgt",   limit: 4,    null: false 
    t.integer "depth",   limit: 4, default: 0, null: false 
    t.integer "children_count", limit: 4, default: 0, null: false 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
    t.string "slug",   limit: 255 
    end 

Category.new donnera

<Category id: nil, name: nil, parent_id: nil, status: 1, lft: nil, rgt: nil, depth: 0, children_count: 0, created_at: nil, updated_at: nil, slug: nil>

+0

Enums crée des étendues par défaut. Par conséquent, 'active' et' inactive' sont déjà présents. Supprimez votre définition de 'active'. – yzalavin

Répondre

0

Le problème provient de @category = Category.active.find params[:category_id]. #find s'attend à ce que id soit passé, mais actuellement vous passez slug pour params[:category_id]. Essayez le Category.active.friendly.find params[:category_id]. Cela permettra de récupérer les catégories par slug.

Cette article aidera.

+0

Essayé. Didnt'work – user3576036

+0

Qu'est-ce qui n'a pas fonctionné exactement? – yzalavin

+0

Ce 'Category.active.friendly.find params [: category_id]'. Ce n'est toujours pas interroger. – user3576036