Wie in der Abbildung unten gezeigt, ist es eine Funktion, eine Liste der Produkte anzuzeigen, die zur ausgewählten Kategorie gehören. Die Kategorien sind mehrstufig und je niedriger die Ebene, desto enger wird die Suche. Kategorien werden anhand der Abstammung von Edelsteinen erstellt.
Die App in diesem Artikel verwendet drei Kategorienebenen. In diesem Artikel ist die oberste Kategorie die "übergeordnete Kategorie" und die darunter liegende Hierarchie die "untergeordnete Kategorie". Darunter wird die "Enkelkategorie" ausgedrückt.
Die folgenden Artikel sind hilfreich für die Installation von Abstammung. https://qiita.com/Sotq_17/items/120256209993fb05ebac https://qiita.com/pdm21/items/fe0055b3190af790f1c0
Zuerst erstellen wir eine Listenseite, auf der alle Kategorien angezeigt werden. Verwenden Sie die Indexaktion des Categories Controllers.
app/controllers/categories_controller.rb
def index
@parents = Category.where(ancestry: nil)
end
Da die Abstammungsspalte der übergeordneten Kategorie Null ist, können Sie die übergeordnete Kategorie mit der obigen Beschreibung abrufen.
app/views/categories/index.html.haml
%h1 Kategorieliste
%ul.categories
- @parents.each do |parent|
%li.parents= link_to "#{parent.name}", category_path(parent)
%ul.categories__children
- parent.children.each do |child|
%li.childern= link_to "#{child.name}", category_path(child)
%ul.categories__grandchildren
- child.children.each do |grandchild|
%li= link_to "#{grandchild.name}", category_path(grandchild)
Sie können jetzt alle Kategorien auflisten. Jeder Kategoriename ist nach der später beschriebenen Kategorie mit der Produktlistenseite verknüpft.
Als Nächstes erstellen wir eine Seite, auf der die Produkte aufgelistet sind, die zur ausgewählten Kategorie gehören. Verwenden Sie die Show-Aktion des Categories-Controllers.
app/controllers/categories_controller.rb
before_action :set_category, only: :show
def show
@items = @category.set_items
@items = @items.where(buyer_id: nil).order("created_at DESC").page(params[:page]).per(9)
end
private
def set_category
@category = Category.find(params[:id])
end
Verwenden Sie die Modellmethode set_items, die später beschrieben wird, um die Produkte in der Kategorie abzurufen.
app/models/category.rb
has_many :items
has_ancestry
def set_items
#Für übergeordnete Kategorie
if self.root?
start_id = self.indirects.first.id
end_id = self.indirects.last.id
items = Item.where(category_id: start_id..end_id)
return items
#Für untergeordnete Kategorien
elsif self.has_children?
start_id = self.children.first.id
end_id = self.children.last.id
items = Item.where(category_id: start_id..end_id)
return items
#Für Enkelkategorie
else
return self.items
end
end
Die ID der Enkelkategorie ist in der Kategorie-ID des Produkts registriert. Wenn Sie also einfach @items = @ category.items schreiben, können Sie die Produktinformationen nur erhalten, wenn @category ein Enkel ist. Daher wird, wie oben beschrieben, eine bedingte Verzweigung durchgeführt, abhängig davon, welchem Elternteil, Kind oder Enkel die Kategorie entspricht. Wenn es sich bei der Kategorie um ein Elternteil oder ein Kind handelt, wird das Produkt durch Angabe des ID-Bereichs der Enkelkategorie erworben, deren Eigentümer es ist.
Die folgenden Artikel sind hilfreich, wenn Sie Abstammungs-spezifische Methoden wie root? Und indirekte verwenden. https://qiita.com/Rubyist_SOTA/items/49383aa7f60c42141871
app/views/categories/show.html.haml
.products-container
.products-index
.title
= "#{@category.name}Produktliste"
.title__border
- if @items
%ul.lists
= render "items/item", items: @items
= paginate @items
Die auf allen Produktlistenseiten verwendete Teilvorlage wird freigegeben. Der angezeigte Inhalt wird entsprechend dem Wert von @items geändert.
Fügen Sie abschließend wie unten gezeigt Links zu anderen Kategorien hinzu, um das Auffinden von Produkten zu erleichtern. Wenn die Anzeigekategorie übergeordnet oder untergeordnet ist, verknüpfen Sie die Kategorie mit einer Ebene darunter. Zeigen Sie für Enkelkinder Links zu Enkelkategorien an, die zur selben untergeordneten Kategorie gehören.
app/controllers/categories_controller.rb
def set_category
@category = Category.find(params[:id])
#Nachtrag---------------------------------
if @category.has_children?
@category_links = @category.children
else
@category_links = @category.siblings
end
# -------------------------------------
end
app/views/categories/show.html.haml
//Nachtrag--------------------------------------------------
.category_wrapper
.category_links
- @category_links.each do |category|
= link_to category.name, category_path(category)
// -----------------------------------------------------
.products-container
.products-index
.title
= "#{@category.name}Produktliste"
.title__border
- if @items
%ul.lists
= render "items/item", items: @items
= paginate @items
Wenn Sie das CSS danach entsprechend anordnen, wird es abgeschlossen.
Damit ist die Funktion zum Suchen nach Produkten aus mehrstufigen Kategorien abgeschlossen. Vielen Dank, dass Sie so weit gelesen haben.
Recommended Posts