2016-04-24 3 views
0

Ich bin mit einem kleinen Problem mit der Anzeige Shoppe Kategorien fest. Ich möchte, dass der Kategoriename und das Bild auf meiner Indexseite angezeigt werden. Der Kategoriename dient als Link zur Kategorieseite, auf der Produkte dieser Kategorie angezeigt werden. Ich habe den folgenden Code aus meiner Sicht:Shoppe Kategorie Routing

<% @products.each do |category, products| %> 
    <%= link_to category.name, product_category_path %> 
<% end %> 

aber es gibt mir einen Fehler undefined local variable or method 'product_category_path' for #<#<Class:0xb22076fc>:0xb2205870>

soll ich einen Controller für die Kategorien macht, sowie für Produkte? Denn jetzt habe ich nur products_controller.rb mit dem folgenden Code haben:

class ProductsController < ApplicationController 
    def index 
     @products = Shoppe::Product.root.ordered.includes(:product_categories, :variants) 
     @products = @products.group_by(&:product_category) 
    end 
    def show 
     @product = Shoppe::Product.root.find_by_permalink(params[:permalink]) 
    end 
end 
+0

Könnten Sie bitte 'Rake-Routen' sehen und sehen, ob Sie den richtigen Routenhilfspfad verwenden – illusionist

+0

Sie sollten in Ordnung sein, wenn Sie eine Kategorie ID '<% = link_to category.name, product_category_path (category.id)%> ' – 7urkm3n

Antwort

0

Ich bin unklar, was tun Sie hier erreichen wollen, aber die Fehlermeldung ist sehr klar. wenn Sie rake routes laufen Sie keinen Pfad genannt finden product_category_path

Sie

resources :products do 
    resources :categories 
end 

in Ihrer routes.rb Datei setzen müssen, und Sie benötigen eine CategoriesController mit show Aktion

der Grund, warum ich erstellen bin verwirrt

<%= link_to category.name, product_category_path %> 

product_category_path bedeutet Sie wollen eine URL wie dieser

/products/:product_id/categories/:id(.:format) 

und Sie haben product_category_path(product, category)

verwenden, aber es passt Ihre Beschreibung dessen, was Sie tun möchten. was Ihr wirklich category_path nur einfach könnte sein wollen, in diesem Fall, dass Sie eine Kategorieseite mit allen Produkten gehört es, wie dieser

/categories/:id(.:format) 

und für Sie sehen, können Sie tun Sie zugreifen können

<%= link_to category.name, category_path(category) %> 

noch müssen CategoriesController mit action zu schaffen, aber es wird nicht fragen für product_id

der Controller-Code wie folgt aussehen (vorausgesetzt, dass Sie den Verein richtig eingestellt)

class CategoriesController < ApplicationController 
    def show 
    @category = Category.includes(:products).find(params[:id]) 
    end 
end 
+0

dies ist, was ich innerhalb' rake routes' habe: 'product_category GET /product_categories/:id(.:format) shoppe/product_categories # show' – AlexNikolaev94

+0

@ AlexNikolaev94' shoppe/product_categories # show' fordert Schienen auf, nach 'Shoppe :: ProductCategories' Controller zu suchen und dort' show' Aktionen aufzurufen. Wenn ich Ihren Code richtig verstanden habe, haben Sie 'product_categories' gemeinsame Tabelle. Es ist ungewöhnlich, eine Ansicht für ein gemeinsames Modell zu haben, und es klingt in Ihrem Fall nicht notwendig. –

+1

@Zhiliang Takuto Xing Ihre Lösung ist Klang, aber es hängt auch vom Anwendungsfall ab. Was passiert, wenn die "show" -Aktion für Kategorien eine andere Ansicht sein muss, die keine Produkte enthält, sondern nur Informationen über diese Kategorie? Ich denke, dass die Verwendung von Mitgliedsrouten die Anwendung so einrichten wird, dass sie in Zukunft leichter geändert werden kann. –

0

Ich denke, die railsy Weg wäre: Routen

1) Erstellen CategoriesController

2) Verwenden Sie Mitglied

In Ihrer Routen:

resources :categories do 
    member do 
    get :products 
    end 
end 

Ihr Helfer ist dann products_category_path(@category), und die URL wird /categories/:id/products sein.

Eine Mitgliederroute fügt Ihrem Controller eine benutzerdefinierte Aktion products hinzu.

Ihre Indexansicht hätte dies:

<% @products.each do |product| %> 
    <%= link_to product.category.name, products_category_path(product.category) %> 
<% end %> 

In CategoriesController würden Sie haben:

def products 
    Shoppe::Product.where(category_id: params[:id]) 
end 

N. B. Fügen Sie Produktkategorien in Ihre Produktindexaktion ein, um N + 1 Abfragen zu vermeiden