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.
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