[RUBY] Implémentez la fonction de recherche de correspondance partielle sans utiliser Ransuck

J'ai implémenté la fonction de recherche de correspondance partielle sans utiliser Lansuck, je vais donc la résumer. Cette fois, nous allons créer une fonction simple qui vous permet de saisir le nom et l'adresse e-mail et d'obtenir les informations de l'utilisateur correspondant par correspondance partielle.

Exemple
Recherchez "non" dans le formulaire de nom et "" dans le formulaire d'adresse e-mail
             ↓
Nobita Nobi [email protected]
Cela ressemble à une sortie. je veux

Dès la conclusion, je posterai le code en premier.

routes.rb


Rails.application.routes.draw do
  root 'users#index'
  resources :users
end

index.html


 <h1>Faisons une recherche de correspondance partielle pour les personnages Doraemon</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
  <span class="small">Cible de recherche: nom, adresse e-mail</span>
    <div>
      <%= f.label :name, 'Nom' %>
      <%= f.text_field :name , value: @search_params[:name] %>
    </div>
    <div>
      <%= f.label :email, 'adresse mail' %>
      <%= f.text_field :email, value: @search_params[:email] %>
    </div>
  <%= f.submit 'Chercher', class: 'btn btn-default' %>
<%end%>

<h1>Résultats de recherche</h1>
  <% @users.each do |user| %>
    <%= user.name %>
    <%= user.email %>
  <% end %>

users_controller.rb


class UsersController < ApplicationController
  def index
    @search_params = search_params
    @users = User.search(search_params)
  end

  private

  def search_params
    params.permit( :name, :email  )
  end
end

user.rb


class User < ApplicationRecord
  scope :search, -> (search_params) do
    return if search_params.blank?
      name_like(search_params[:name] )
      .email_like(search_params[:email])
    end
  scope :name_like, -> (name){where("name LIKE ?" ,"%#{name}%")}
  scope :email_like, -> (email){where("email LIKE ?", "%#{email}%")}
end

schema.rb



ActiveRecord::Schema.define(version: 2020_10_10_011424) do

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

seeds.rb


User.create!(name: "Nobita Nobi",email: "[email protected]")
User.create!(name: "Takeshi Gouda",email: "[email protected]")
User.create!(name: "Suneo Koshikawa",email: "[email protected]")
User.create!(name: "Doraemon",email: "[email protected]")
User.create!(name: "Dorami-chan",email: "[email protected]")
User.create!(name: "Source Shizuka",email: "[email protected]")

Je vais expliquer chacun d'eux. D'abord de l'explication de vue

index.html


 <h1>Faisons une recherche de correspondance partielle pour les personnages Doraemon</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
  <span class="small">Cible de recherche: nom, adresse e-mail</span>
    <div>
      <%= f.label :name, 'Nom' %>
      <%= f.text_field :name , value: @search_params[:name] %>
    </div>
    <div>
      <%= f.label :email, 'adresse mail' %>
      <%= f.text_field :email, value: @search_params[:email] %>
    </div>
  <%= f.submit 'Chercher', class: 'btn btn-default' %>
<%end%>

<h1>Résultats de recherche</h1>
  <% @users.each do |user| %>
    <%= user.name %>
    <%= user.email %>
  <% end %>

Tout d'abord, ici

<%= form_with(scope: :search ,url: 'users', local: true, method: :get) do |f| %>

Le formulaire de recherche utilise form_with. La différence entre form_tag et form_for est expliquée d'une manière facile à comprendre à l'URL suivante. https://qiita.com/hmmrjn/items/24f3b8eade206ace17e (Auparavant, form_tag était utilisé lorsqu'il n'y avait pas de modèle associé, mais form_for était utilisé lorsqu'il y avait un modèle associé, mais il est déconseillé dans les rails 5.1. À titre d'exemple concret, je souhaite simplement utiliser les informations utilisateur ( Lors de la recherche) etc. est form_tag Je veux enregistrer les informations utilisateur → J'ai utilisé form_for lorsque la base de données à enregistrer existait. ) Form_with, qui a été recommandé depuis rails 5.1, divise bien le traitement autour de lui et l'exécute. De plus, Ajax pour la communication asynchrone est implémenté par défaut. Puisque JS n'est pas utilisé cette fois, local: true est spécifié pour désactiver le formulaire distant, et les données sont communiquées au format HTML par la méthode: get.

Ensuite, regardons le contrôleur.

``users_controller.rb`


class UsersController < ApplicationController
  def index
    @search_params = search_params
    @users = User.search(search_params)
  end

  private

  def search_params
    params.permit( :name, :email  )
  end
end

La seule chose ici est User.search (search_params). Il s'agit de la méthode de recherche, mais le modèle utilisateur couvre la fonction de recherche de correspondance partielle. Pour la valeur envoyée, la recherche renvoie une correspondance partielle avec le nom et l'adresse e-mail. Puis référez-vous au modèle.

user.rb


class User < ApplicationRecord
  scope :search, -> (search_params) do
    return if search_params.blank?
      name_like(search_params[:name] )
      .email_like(search_params[:email])
    end
  scope :name_like, -> (name){where("name LIKE ?" ,"%#{name}%")}
  scope :email_like, -> (email){where("email LIKE ?", "%#{email}%")}
end

La zone de recherche volera ici, effectuera un traitement partiel un par un, puis sera renvoyée au contrôleur. return if search_params.blank? En mettant, même si aucune valeur n'est saisie, le processus y sera arrêté et renvoyé au contrôleur. Si la cible de recherche est multiple telle que: nom: email comme cette fois, les paramètres sont traités de manière itérative et la recherche est renvoyée un par un.

C'est tout pour cette fois. Veuillez indiquer de plus en plus s'il y avait quelque chose de différent ici.

Recommended Posts

Implémentez la fonction de recherche de correspondance partielle sans utiliser Ransuck
[Rails] Implémenter la fonction de recherche d'utilisateurs
Fonction de recherche à l'aide de [rails] ransack
Implémenter la fonction de catégorie en utilisant l'ancêtre
Implémenter la fonctionnalité de recherche à l'aide de la clause LIKE
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
Implémentez la fonction Star Five à l'aide de l'instruction for
Mettre en œuvre la fonction de classement par étoiles en utilisant Raty dans Rails 6
Mettre en œuvre la fonction de catégorie de produit en utilisant l'ascendance ① (Préparation)
Comment mettre en œuvre la fonction de chapelure avec Gretel
Flux pour implémenter la fonction de publication d'images à l'aide d'ActiveStorage
Mettre en œuvre la fonction de recherche avec l'API Rakuten Books (DVD)
[Ruby on Rails] Comment implémenter la fonction de balisage / recherche incrémentielle pour les articles (sans gemme)
Suite ・ Flux pour implémenter la fonction de publication d'image à l'aide d'ActiveStorage
Implémenter la fonction de recherche de publication dans l'application Rails (méthode where)
Implémenter le test double dans JUnit sans utiliser de bibliothèques externes
[Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem
Essayez de mettre en œuvre à l'aide de l'API de recherche de produits Rakuten (facile)