[RUBY] [Für Anfänger von Rails] Mehrfachsuchfunktion ohne Gem implementiert

Vorwort

Implementieren Sie Suchfunktionen für mehrere Modelle, ohne Ransack zu verwenden. Die Suchmethode und das Suchmodell können aus dem Pulldown-Menü ausgewählt werden. Der Suchbildschirm wird direkt unter der Kopfzeile implementiert, und der Bildschirm zur Anzeige der Suchergebnisse erstellt eine neue Ansicht. Ich bin ein Neuling, ungefähr einen Monat nachdem ich angefangen habe, Schienen zu studieren. Bitte verpassen Sie keine seltsamen Ausdrücke oder Beschreibungen ... (oder weisen Sie in der Frage darauf hin)

Implementierungsumgebung / -voraussetzung

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

Bitte erstellen Sie das Benutzermodell und das Postmodell im Voraus. Ich habe Devise implementiert.

Spezifischer zu implementierender Inhalt

Geben Sie auf der vom Benutzer veröffentlichten Website die folgenden drei Eingaben in die Kopfzeile ein: Suchen und Übergang zum Anzeigebildschirm.

① Wählen Sie im Pulldown-Menü (form_with) die Option Benutzersuche oder Post-Suche (Buchmodell in meiner App). (2) Wählen Sie die Auswahlmethode als exakte Übereinstimmung, Präfixübereinstimmung, Suffixübereinstimmung oder teilweise Übereinstimmung mit dem Auswahltag aus. ③ Geben Sie ein Schlüsselwort ein

Bild nach der Montage

Suchformular ☟

image.png

Ansicht der Suchergebnisanzeige (Suchergebnis von Test / Buch / Teilübereinstimmung) ☟

image.png

Lassen Sie es uns implementieren!

① Erstellen Sie einen Controller

$ rails g controller Search search

** Erläuterung (Klick) ** Ich erstelle auch eine Suchaktion

② Routenbeschreibung

routes.rb


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

③ Formularerstellung (mit form_with)

** Erläuterung (Klick) ** -Der Autor macht den Header-Teil teilweise, aber ich denke, dass er problemlos implementiert werden kann, wenn Sie Folgendes in application.html.erb beschreiben, und ich denke, dass er auch implementiert werden kann, indem er in einer bestimmten Ansicht beschrieben wird. * Der Klassenname ist eine Beschreibung für die Darstellung von Bootstrap. Wenn Sie eine andere Version haben oder Gem nicht installiert haben, müssen Sie diese nicht beschreiben. (Bitte gestalten Sie es selbst)

_header.html.erb


*Der Code über dieser Zeile wird weggelassen
<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({ "Perfekte Übereinstimmung" => "match", "Präfixübereinstimmung" => "forward", "Rückwärtsspiel" => "backward", "Teilweise Übereinstimmung" => "partical"  }) %>
        <%= f.submit :"Suche" %>
      <% end %>
    <% end %>
  </div>
</div>
** Erläuterung (Klick) ** - ** User_signed_in? ** in der if-Anweisung ist die Hilfsmethode von Devise, die bestimmt, ob der Benutzer angemeldet ist. Mit anderen Worten, hier wird das Suchformular nur angezeigt, wenn der Benutzer angemeldet ist. -Sie können mit ** f.select ** und ** options_for_select ** nach unten ziehen. Für weitere Informationen zu form_with gibt es meiner Meinung nach viele Websites, die als Referenz verwendet werden können. Schauen Sie sich diese also bitte an. - ** 'Suche [Modell]', options_for_select () ** ist ** {"Anzeigename (Benutzer)" => "Modellname (Benutzer)"} **, auf die Sie verweisen möchten. - ** 'Search [how]', options_for_select () ** ist ** {"Anzeigename (genaue Übereinstimmung)" => "Variablenname (Übereinstimmung)"} **. #### ④ Beschreibung der Steuerung

search_controller.rb


class SearchController < ApplicationController
  
  def search
    @model = params["search"]["model"]          #Modell auswählen@Dem Modell zuweisen
    @value = params["search"]["value"]          #Gesuchte Zeichenkette(Hier Wert)Zu@Wert zuweisen
    @how = params["search"]["how"]          #Suchmethode auswählen wie@Zuweisen, wie
    @datas = search_for(@how, @model, @value)      #search_Definieren Sie die Instanzvariable in for argument
  end                          #@Daten enthalten die endgültigen Suchergebnisse
  
  private

  def match(model, value)                     #def search_Verarbeitung, wann wie übereinstimmt
    if model == 'user'                        #Verarbeitung, wenn das Modell Benutzer ist
      User.where(name: value)                 #Wo finde ich einen Namen, der genau dem Wert entspricht?
    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)    #Die in der Suchaktion definierten Informationen sind im Argument enthalten
    case how                              #Der Prozess des Suchens aus dem bedingten Zweig von wann, welches der Inhalt von wie der Suchmethode ist
    when 'match'
      match(model, value)                 #Im Argument der Suchmethode(model, value)Ist definiert
    when 'forward'                        #Wenn beispielsweise wie übereinstimmt, fahren Sie mit der Verarbeitung der def-Übereinstimmung fort.
      forward(model, value)
    when 'backward'
      backward(model, value)
    when 'partical'
      partical(model, value)
    end
  end
end
#Präfixübereinstimmung
Modellname.where("Spaltenname LIKE?", "Wert%")
#Rückwärtsspiel
Modellname.where("Spaltenname LIKE?", "%Wert")
#Teilweise Übereinstimmung
Modellname.where("Spaltenname LIKE?", "%Wert%")

⑤ Ansichtsseite bearbeiten

Ich werde es in views / search / search.html.erb beschreiben

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>
** Erläuterung (Klick) ** Es fühlt sich an, als würde man den Inhalt von ** @ data **, der in der Steuerung definiert ist, mit einer if-Anweisung und jedes Modell mit einer each-Anweisung drehen. Der Klassenname ist derselbe wie ③ und eine Beschreibung für Bootstrap. Durch Schreiben von ** <% = @ value%> ** wird die gesuchte Zeichenfolge angezeigt. ##### Bonus Ich habe einige Zeit gebraucht, um den Prozessablauf der Steuerung zu verstehen (obwohl ich ihn immer noch nicht perfekt verstehe). Ich hatte das Gefühl, dass es einfacher zu verstehen wäre, wenn ich mit einer Funktion wie byebug einen Haltepunkt in der Steuerung erstellen und den Inhalt der Variablen im Terminal überprüfen würde. Versuchen Sie es also bitte. Der Controller enthält viele Beschreibungen. Bitte verzeihen Sie mir! Bitte beziehen Sie sich darauf, wenn Sie ☟ mögen [Mein Artikel über DM-Funktion x Ajax] (https://qiita.com/IsakiMatsuo/items/9923d0724c69a2dfa259)

Recommended Posts