Je l'ai implémenté en recherchant dans plusieurs colonnes à l'aide de Gem ** ransack ** dans l'application Flima.
S'il y a un mot-clé dans le titre du produit ou dans le texte et que les conditions spécifiées sont remplies, le produit sera frappé. La vue de la barre de recherche est ci-dessous.
Au fait, le tableau est le suivant.
Catégorie ... genre Statut du produit ... statut Frais d'expédition ... ours Jours jusqu'à l'expédition ... jour Prix ... prix
est. «Catégorie», «État du produit», «Frais de port» et «Jours d'expédition» sont stockés dans le tableau uniquement par identifiant à l'aide d'ActiveHash. Je voudrais effectuer une recherche qui peut affiner les éléments qui touchent tous les éléments ci-dessus + mots-clés (titre du produit ou contenu textuel).
item_controller
class ItemsController < ApplicationController
# index,show,Puisque l'en-tête de la fenêtre de recherche est défini sur la page de recherche, il est exécuté au moment de cette action.
before_action :search_product, only: [:index, :show, :search]
#réduction
private
def search_product
@p = Item.ransack(params[:q]) #Générer un objet de recherche
@results = @p.result
end
end
: q in (params [: q]) est la clé de paramètre par défaut pour les paramètres de recherche.
Les éléments suivants sont synonymes, mais vous pouvez utiliser la méthode de ransack par défaut si la recherche est déjà définie ailleurs.
Item.ransack(params[:q])
Item.search(params[:q])
@ p = Item.ransack (params [: q])
Après avoir créé l'objet de recherche ici,
Je mets les résultats de la recherche dans @results avec @ results = @ p.result
.
Recherche vue
# @Mettez les informations de recherche dans p et transmettez-les au contrôleur.
<%= search_form_for @p, url: search_items_path do |f| %>
<div class = 'nav-up'>
# :title_or_text_cont est du texte_Description indiquant si les caractères saisis dans le champ sont inclus dans le titre ou le texte
<%= f.text_field :title_or_text_cont, placeholder: "Recherche par mots-clés", class: "input-box" %>
<button class="search-button">
<%= image_tag("search.png ", class:"search-icon") %>
</button>
</div>
<div class='nav-down'>
<div class='label-select'>
<%= f.label :genre_id_eq, 'Catégorie', class: 'label' %>
<%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name, include_blank: 'non spécifié', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :status_id_eq, 'État du produit', class: 'label' %>
<%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name, include_blank: 'non spécifié', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :bear_id_eq, 'Frais de port', class: 'label' %>
<%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name, include_blank: 'non spécifié', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :day_id_eq, 'Jours d'expédition', class: 'label' %>
<%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name, include_blank: 'non spécifié', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :price, 'prix', class: 'label' %>
<%= f.radio_button :price_lteq, '' %>
non spécifié
<%= f.radio_button :price_lteq, '1000' %>
1000 yens ou moins
<%= f.radio_button :price_lteq, '2500' %>
2500 yens ou moins
<%= f.radio_button :price_lteq, '5000' %>
5000 yens ou moins
<br>
</div>
</div>
<% end %>
ruby:search.html.erb
<% if @results.present? %>
<ul class='item-lists'>
<% @results.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% else %>
<div>
<p>Il n'y a pas de produit correspondant. Cherchons en changeant les conditions!</p>
</div>
<ul class='item-lists'>
<% Item.all.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% end %>
Avec ce qui précède, vous pouvez affiner les produits qui correspondent aux résultats de la recherche. Je donnerai une explication détaillée à une date ultérieure.
Recommended Posts