Dieses Mal werden die Post-Daten (Post) angezeigt, indem eine Schlüsselwortsuche in der Suchleiste durchgeführt wird. Darüber hinaus werden wir mehrere Tabellen verknüpfen und implementieren, damit sie innerhalb dieses Bereichs durchsucht werden können.
MacOS 10.15.7 ruby 2.6.5 Ruby on Rails 6.0.0
Wir haben eine Tabelle mit dem Benutzer als "Benutzer", dem Beitrag als "Beitrag", dem Bild als "Bild" und der Präfektur als "Präfektur" (Startdaten) erstellt. (Der Inhalt der Tabelle wird zum Posten vereinfacht)
Die Beziehungen sind wie folgt.
user.rb
has_many :posts, dependent: :destory
post.rb
belongs_to :user
belongs_to :prefecture
has_many :images, dependent: :destory
accepts_nested_attributes_for :images, allow_destroy: true
image.rb
belongs_to :post
mount_uploader :image, ImageUploader
prefecture.rb
has_many :posts
Es sieht aus wie das. Ich habe auch Benutzer und Bild eingeführt, aber dieses Mal werde ich die Erklärung weglassen, weil sie nicht verwandt sind. Da die Präfektur mehrere Beiträge hat, wird sie als "has_many: posts" festgelegt. Da der Beitrag zur Präfektur gehört, heißt er "gehört zur Präfektur".
Erstellen Sie auf diese Weise eine Suchleiste.
erb:index.html.erb
<%= form_with(url: search_posts_path, local: true, method: :get, class: "rootpageSearchForm") do |form| %>
<%= form.text_field :keyword, placeholder: "Geben Sie ein Stichwort ein", id: 'Search_Form', class: "rootpageSearchForm__content" %>
<%= form.submit "Suche", class: "rootpageSearchForm__bottum" %>
<% end %>
index.scss
.rootpageSearchForm {
width: auto;
&__content {
width: 40vw;
height: 30px;
color: #000000;
border-radius: 5px;
border-color: #008bbb;
}
&__bottum {
margin-left: 0.5vw;
height: 30px;
width: 150px;
border-radius: 20px;
background-color: #87cefa;
border: none;
box-shadow: 0 0 8px gray;
color: #ffffff;
-webkit-transition: all 0.3s ease;
-moz-transition: all 0.3s ease;
-o-transition: all 0.3s ease;
transition: all 0.3s ease;
}
.rootpageSearchForm__bottum:hover {
background-color: #00bfff;
}
}
Das ist alles. Das fertige Bild sieht so aus.
Definieren Sie eine neue Suchaktion in route.rb. Dieses Mal definieren wir es in der Post-Aktion in verschachtelter Form. Es ist wie folgt definiert.
routes.rb
Rails.application.routes.draw do
resources :posts do
collection do
get 'search'
end
end
Einige der folgenden Punkte sind weggelassen...
end
Dieses Mal werden die entsprechenden Beiträge als Liste mit dem Suchbegriff angezeigt, sodass keine ID erforderlich ist.
collection do
get 'search'
end
Ist definiert als.
Wenn Sie eine ID benötigen (z. B. eine Post-Detail-Seite), definieren Sie sie mit member anstelle von collection. Der Unterschied zwischen Sammlung und Mitglied besteht darin, ob die URL eine ID hat oder nicht.
Sammlung ・ ・ ・ Dem Routing ist keine ID zugeordnet. Mitglied ・ ・ ・ Eine ID ist an das Routing angehängt.
class Post < ApplicationRecord
...Ein Teil des oben genannten wurde weggelassen
def self.search(search)
if search != ""
Post.where('content LIKE(?) OR title LIKE(?), "%#{search}%", "%#{search}%")
else
Post.all
end
end
Einige der folgenden Punkte sind weggelassen...
end
Verwenden Sie die "where-Methode", um die "Instanz des Datensatzes, die der Bedingung entspricht" in Form eines Arrays abzurufen, das auf der im Argument beschriebenen Bedingung basiert.
Ich benutze die LIKE-Klausel
, um nach mehrdeutigen Zeichenfolgen zu suchen.
String | Bedeutung |
---|---|
% | Beliebige Zeichenfolge (einschließlich leerer Zeichenfolge) |
_ | Beliebiges Zeichen |
Ausführungsbeispiel
Ausführungsbeispiel | Bedeutung |
---|---|
where('title LIKE(?)', "a%") | Titel beginnend mit a |
where('title LIKE(?)', "%b") | Titel mit der Endung b |
where('title LIKE(?)', "d_") | Titel mit c |
where('title LIKE(?)', "%b") | Titel aus zwei Buchstaben beginnend mit d |
where('title LIKE(?)', "_e") | Titel aus zwei Buchstaben, der mit e endet |
Die Argumentensuche enthält die vom Suchformular gesendeten Parameter.
Schreiben Sie daher if search! =" "
, Und die Bedingung ist, dass ein Wert in das Suchformular eingegeben wird.
Wenn die Suchtaste gedrückt wird, wenn nichts in das Suchformular eingegeben wird (leerer Zustand), ist der Inhalt der an das Argument übergebenen Suche leer. Beschreiben Sie daher die Verarbeitung in diesem Fall in der else-Anweisung. Dieses Mal werden als "Post.all" alle Beiträge erfasst und angezeigt.
__ Grundsätzlich wird die Methode zur Interaktion mit der Tabelle im Modell platziert! __ __
Definieren Sie eine Suchaktion in posts_controller.rb.
posts_controller.rb
class PostsController < ApplicationController
...Ein Teil des oben genannten wurde weggelassen...
def search
@posts = Post.search(params[:keyword]).order(created_at: :desc)
end
...Einige der folgenden Punkte sind weggelassen...
Schreiben Sie "params [: keyword]" in das Argument der Suchmethode und übergeben Sie das Suchergebnis.
Da die Suchergebnisse in der Reihenfolge der neuesten Beiträge angeordnet sind, wird sie auch als "Reihenfolge (created_at: desc)" bezeichnet.
Erstellen Sie anschließend search.html.erb, um den Suchergebnisbildschirm anzuzeigen, und der Vorgang ist abgeschlossen.
ruby:search.html.erb
<div class="wrapper">
<% @posts.each do |post| %>
<div class='contents row'>
...Unten weggelassen...
<% end %>
</div>
Sie können die Suchergebnisse jetzt über die Suchleiste und die Stichwortsuche anzeigen. Mit den Einstellungen bis zu diesem Punkt werden die "Inhalte (Post-Text)" und "Titel (Post-Titel)" der Post-Tabelle durchsucht.
Dieses Mal möchte ich dem Suchziel "Name (Präfekturname)" in der Präfekturtabelle hinzufügen, damit Sie auch nach Präfekturnamen suchen können.
Wir werden dem Postmodell eine Beschreibung hinzufügen.
class Post < ApplicationRecord
...Ein Teil des oben genannten wurde weggelassen
def self.search(search)
if search != ""
Post.joins(:prefecture).where('content LIKE(?) OR title LIKE(?) OR prefectures.name LIKE(?)', "%#{search}%", "%#{search}%", "%#{search}%")
else
Post.all
end
end
Einige der folgenden Punkte sind weggelassen...
end
Die Präfekturtabelle wird auch als "Joins (: Präfektur)" hinzugefügt, die durchsucht werden sollen. Die "Join-Methode" ist eine "Methode", die verwendet wird, wenn Sie mehrere Tabellen zu einer verbinden möchten. In diesem Fall werden die Posttabelle und die Präfekturtabelle zusammengefügt und als eine Tabelle behandelt.
Im Argumentteil der where-Methode wird "OR prefectures.name LIKE (?)" Hinzugefügt, um den Präfekturnamen als Suchziel anzugeben. Fügen Sie ein "% # {search}%" für diesen Betrag hinzu und Sie sind fertig.
Da ich ein Anfänger bin, würde ich es begrüßen, wenn Sie auf Fehler hinweisen könnten. Danke, dass du bis zum Ende zugesehen hast.
Recommended Posts