[RUBY] [Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem

Préface

Implémentez la fonctionnalité de recherche sur plusieurs modèles sans utiliser de ransack. La méthode de recherche et le modèle de recherche peuvent être sélectionnés dans le menu déroulant. L'écran de recherche sera implémenté directement sous l'en-tête, et l'écran d'affichage des résultats de recherche créera une nouvelle vue. Je suis un nouveau venu environ un mois après avoir commencé à étudier les rails, alors s'il vous plaît, manquez toute expression ou description étrange ... (ou indiquez-le dans la question)

Environnement / prémisse de mise en œuvre

ruby '2.6.3' gem 'rails', '~> 5.2.4', '>= 5.2.4.3' gem'bootstrap-sass ',' ~> 3.3.6 '(non requis)

Veuillez créer le modèle utilisateur et le modèle de publication à l'avance. J'ai implémenté Devise.

Contenu spécifique à mettre en œuvre

Sur le site publié par l'utilisateur, entrez les trois entrées suivantes dans l'en-tête, recherchez et passez à l'écran d'affichage.

① Sélectionnez Recherche d'utilisateur ou recherche de publication (modèle de livre dans mon application) dans le menu déroulant (form_with) (2) Sélectionnez la méthode de sélection comme correspondance exacte, correspondance de préfixe, correspondance de suffixe ou correspondance partielle avec la balise de sélection. ③ Entrez un mot-clé -Afficher les résultats de la recherche dans View (permet de modifier le contenu d'affichage des résultats de la recherche avec une instruction if)

Image après le montage

Formulaire de recherche ☟

image.png

Vue de l'affichage des résultats de recherche (résultat de la recherche test / livre / correspondance partielle) ☟

image.png

Implémentons-le!

① Créer un contrôleur

$ rails g controller Search search

<détails> <résumé> ** Explication (clic) ** </ résumé> Je crée également une action de recherche </ details>

② Description de l'itinéraire

routes.rb


get '/search' => 'search#search'

③ Création de formulaire (en utilisant form_with)

<détails> <résumé> ** Explication (clic) ** </ résumé> -L'auteur rend la partie d'en-tête partielle, mais je pense qu'elle peut être mise en œuvre sans problème si vous décrivez ce qui suit dans application.html.erb, et je pense qu'il peut également être implémenté en le décrivant dans une vue spécifique.

_header.html.erb


*Le code au-dessus de cette ligne est omis
<div class="row">
  <div class="col-xs-6 col-xs-offset-3 text-center" style="margin-top: 25px;">
    <% if user_signed_in? %>
      <%= form_with url:search_path, method: :get, local: true do |f| %>
        <%= f.text_field 'search[value]' %>
        <%= f.select 'search[model]', options_for_select({ "User" => "user", "Book" => "book" }) %>
        <%= f.select 'search[how]', options_for_select({ "Correspondance parfaite" => "match", "Correspondance de préfixe" => "forward", "Match en arrière" => "backward", "Match partiel" => "partical"  }) %>
        <%= f.submit :"Chercher" %>
      <% end %>
    <% end %>
  </div>
</div>

<détails> <résumé> ** Explication (cliquez) ** </ résumé>

④ Description au contrôleur

search_controller.rb


class SearchController < ApplicationController
  
  def search
    @model = params["search"]["model"]          #Sélectionnez le modèle@Attribuer au modèle
    @value = params["search"]["value"]          #Chaîne de caractères recherchée(Ici valeur)À@Attribuer à la valeur
    @how = params["search"]["how"]          #Sélectionnez la méthode de recherche comment@Attribuer à comment
    @datas = search_for(@how, @model, @value)      #search_Définir la variable d'instance dans pour l'argument
  end                          #@les données contiendront les résultats finaux de la recherche
  
  private

  def match(model, value)                     #def search_Traitement de la correspondance pour
    if model == 'user'                        #Traitement lorsque le modèle est utilisateur
      User.where(name: value)                 #Où trouver un nom qui correspond exactement à la valeur
    elsif model == 'book'           
      Book.where(title: value)
    end
  end
  
  def forward(model, value)
    if model == 'User'
      User.where("name LIKE ?", "#{value}%")
    elsif model == 'book'
      Book.where("title LIKE ?", "#{value}%")
    end
  end
  
  def backward(model, value)
    if model == 'user'
      User.where("name LIKE ?", "%#{value}")
    elsif model == 'book'
      Book.where("title LIKE ?", "%#{value}")
    end
  end
  
  def partical(model, value)
    if model == 'user'
      User.where("name LIKE ?", "%#{value}%")
    elsif model == 'book'
      Book.where("title LIKE ?", "%#{value}%")
    end
  end
  
  def search_for(how, model, value)    #Les informations définies dans l'action de recherche sont incluses dans l'argument
    case how                              #Le processus de recherche à partir de la branche conditionnelle de quand quel est le contenu du comment de la méthode de recherche
    when 'match'
      match(model, value)                 #Dans l'argument de la méthode de recherche(model, value)Est défini
    when 'forward'                        #Par exemple, si comment correspond, procédez au traitement de la correspondance par défaut.
      forward(model, value)
    when 'backward'
      backward(model, value)
    when 'partical'
      partical(model, value)
    end
  end
end
#Correspondance de préfixe
Nom du modèle.where("Nom de colonne LIKE?", "valeur%")
#Match en arrière
Nom du modèle.where("Nom de colonne LIKE?", "%valeur")
#Match partiel
Nom du modèle.where("Nom de colonne LIKE?", "%valeur%")

⑤ Modifier la page de vue

Je vais le décrire dans views / search / search.html.erb

search.html.erb


<div class="container">
  <div class="col-xs-12">
    <% if @model == "user" %>
    <h2>Users search for '<%= @value %>'</h2>
    <table class="table">
        <thead>
            <tr>
                <th></th>
                <th>Name</th>
                <th>Introduction</th>
            </tr>
        </thead>
    <% @datas.each do |user| %>
        <tbody>
            <tr>
                <th>
                    <%= attachment_image_tag(user, :profile_image, :fill, 40, 40, fallback: "no_image.jpg ", size:'40x40') %>
                </th>
                <th>
                    <%= user.name %>
                </th>
                <th>
                    <%= user.introduction %>
                </th>
            </tr>
        </tbody>
    <% end %>
    <% elsif @model == "book" %>
    <h2>Books search for '<%= @value %>'</h2>
    <table class="table">
        <thead>
            <tr>
                <th></th>
                <th>Title</th>
                <th>Opinion</th>
            </tr>
        </thead>
        <% @datas.each do |book| %>
        <tbody>
            <tr>
                <th>
                    <%= attachment_image_tag(book.user, :profile_image, :fill, 40, 40, fallback: "no_image.jpg ", size:'40x40') %>
                </th>
                <th>
                    <%= book.title %>
                </th>
                <th>
                    <%= book.body %>
                </th>
            </tr>
        </tbody>
        <% end %>
    <% end %>
    </table>
  </div>
</div>

<détails> <résumé> ** Explication (clic) ** </ résumé> Cela ressemble à transformer le contenu de ** @ data ** défini dans le contrôleur avec une instruction if et chaque modèle avec une instruction each. Le nom de la classe est le même que ③ et c'est une description pour le bootstrap. En écrivant ** <% = @ value%> **, la chaîne de caractères recherchée est affichée. </ détails>

prime

J'ai mis du temps à comprendre le flux de processus du contrôleur (même si je ne le comprends toujours pas parfaitement) J'ai senti qu'il serait plus facile de comprendre si je créais un point d'arrêt dans le contrôleur en utilisant une fonction telle que byebug et vérifiais le contenu de la variable dans le terminal, alors essayez-le. Il y a beaucoup de description dans le contrôleur, alors pardonnez-moi! Veuillez vous y référer si vous le souhaitez ☟ [Mon article sur la fonction DM x Ajax] (https://qiita.com/IsakiMatsuo/items/9923d0724c69a2dfa259)

Recommended Posts

[Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
[Ruby on Rails] Comment implémenter la fonction de balisage / recherche incrémentielle pour les articles (sans gemme)
Rails [Pour les débutants] Implémentation de la fonction de commentaire
[Rails 6.0] J'ai essayé d'implémenter une fonction de recherche de balises (une fonction pour affiner par balises) [no gem]
Implémentation de la fonction de recherche floue Rails
[Rails] Implémenter la fonction de recherche d'utilisateurs
(Pour les débutants) [Rails] Installer Devise
[Rails] Recherche à partir de plusieurs colonnes + conditions avec Gem et ransack
Ajoutez une fonction de recherche dans Rails.
Implémentation de la recherche de balises de hachage comme Insta et Twitter dans Rails (pas de gemme)
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme
J'ai essayé d'implémenter la fonction de téléchargement d'images multiples dans Rails afin que plusieurs images puissent être glissées pour le message
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
[Ruby on Rails] Fonction de recherche (non sélectionnée)
Explication de Ruby sur rails pour les débutants ①
[Rails] Résumé des méthodes de conversion / vérification / recherche
IntelliJ IDEA Fonction pratique pour les débutants (importance ★ 5)
Mémorandum d'arbre bifurqué pour les débutants (Partie 5 Arbre de recherche bifurqué)
[Rails pour débutants] Spécifiez la destination de la transition après vous être connecté à plusieurs modèles Devise
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
Paramètres de validation pour la fonction de connexion Ruby on Rails
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
Utilisez [Rails] pour concevoir la fonction utilisateur invité (pour le portefeuille)
[Ruby on Rails] Fonction de recherche (non sélectionnée)
Implémentez la fonction de recherche de correspondance partielle sans utiliser Ransuck
[Pour les débutants] Comment implémenter la fonction de suppression
Faisons une fonction de recherche avec Rails (ransack)
Mémorandum d'arbre bifurqué pour les débutants (Partie 2 Recherche d'arbres bifurqués)
[Pour les débutants] Procédure de création d'un contrôleur à l'aide de rails
IntelliJ IDEA Fonction pratique pour les débutants (importance ★ 5)
[IntelliJ] 5 paramètres de raccourci pour une utilisation pratique
Rails [Pour les débutants] Implémentation de la fonction de commentaire
J'ai créé un plug-in pour IntelliJ IDEA
[Pour les débutants] Comment implémenter la fonction de suppression
Paramètres IntelliJ IDEA
[Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem