Ich habe die Teilübereinstimmungssuchfunktion ohne Verwendung von Lansuck implementiert, daher werde ich sie zusammenfassen. Dieses Mal erstellen wir eine einfache Funktion, mit der Sie den Namen und die E-Mail-Adresse eingeben und die Informationen des entsprechenden Benutzers durch teilweisen Abgleich abrufen können.
Beispiel
Suchen Sie im Namensformular nach "Nein" und im E-Mail-Adressformular nach ""
↓
Nobita Nobi [email protected]
Es fühlt sich an wie Ausgabe. ich will
Abschließend werde ich zuerst den Code veröffentlichen.
routes.rb
Rails.application.routes.draw do
root 'users#index'
resources :users
end
index.html
<h1>Lassen Sie uns eine teilweise Übereinstimmungssuche nach Doraemon-Zeichen durchführen</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
<span class="small">Suchziel: Name, E-Mail-Adresse</span>
<div>
<%= f.label :name, 'Name' %>
<%= f.text_field :name , value: @search_params[:name] %>
</div>
<div>
<%= f.label :email, 'Mail Adresse' %>
<%= f.text_field :email, value: @search_params[:email] %>
</div>
<%= f.submit 'Suche', class: 'btn btn-default' %>
<%end%>
<h1>Suchergebnisse</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: "Quelle Shizuka",email: "[email protected]")
Ich werde jeden erklären. Zunächst aus der Erklärung der Sicht
index.html
<h1>Lassen Sie uns eine teilweise Übereinstimmungssuche nach Doraemon-Zeichen durchführen</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
<span class="small">Suchziel: Name, E-Mail-Adresse</span>
<div>
<%= f.label :name, 'Name' %>
<%= f.text_field :name , value: @search_params[:name] %>
</div>
<div>
<%= f.label :email, 'Mail Adresse' %>
<%= f.text_field :email, value: @search_params[:email] %>
</div>
<%= f.submit 'Suche', class: 'btn btn-default' %>
<%end%>
<h1>Suchergebnisse</h1>
<% @users.each do |user| %>
<%= user.name %>
<%= user.email %>
<% end %>
Zuallererst hier
<%= form_with(scope: :search ,url: 'users', local: true, method: :get) do |f| %>
Das Suchformular verwendet form_with. Der Unterschied zwischen form_tag und form_for wird unter der folgenden URL leicht verständlich erläutert. https://qiita.com/hmmrjn/items/24f3b8eade206ace17e (Bisher wurde form_tag verwendet, wenn es kein verwandtes Modell gab, aber form_for wurde verwendet, wenn es ein verwandtes Modell gab, aber es ist in Rails 5.1 veraltet. Als konkretes Beispiel möchte ich nur Benutzerinformationen verwenden ( Bei der Suche) usw. ist form_tag Ich möchte Benutzerinformationen registrieren → Ich habe form_for verwendet, als die zu registrierende Datenbank vorhanden war. ) Form_with, das seit Rails 5.1 empfohlen wurde, teilt die Verarbeitung gut auf und führt sie aus. Außerdem ist Ajax für die asynchrone Kommunikation standardmäßig implementiert. Da JS diesmal nicht verwendet wird, wird local: true angegeben, um das Remote-Formular zu deaktivieren, und Daten werden im HTML-Format mit der Methode: get übertragen.
Schauen wir uns als nächstes den Controller an.
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
Das einzige, was hier ist, ist User.search (search_params). Dies ist die Suchmethode, aber das Benutzermodell deckt die Teilübereinstimmungssuchfunktion ab. Für den gesendeten Wert gibt die Suche eine teilweise Übereinstimmung mit Name und E-Mail zurück. Dann beziehen Sie sich auf Modell.
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
Der Suchbereich fliegt hierher, führt eine Teilverarbeitung nacheinander durch und wird dann an die Steuerung zurückgegeben. return if search_params.blank? Durch Setzen wird der Prozess dort gestoppt und an die Steuerung zurückgegeben, auch wenn kein Wert eingegeben wurde. Wenn das Suchziel wie dieses Mal mehrere ist, wie z. B.: Name: E-Mail, werden die Parameter iterativ verarbeitet und die Suche wird nacheinander zurückgegeben.
Das ist alles für diese Zeit. Bitte weisen Sie immer mehr darauf hin, ob hier etwas anderes war.