Implémentez la fonctionnalité de recherche sur plusieurs modèles sans utiliser de ransack. La méthode de recherche et le modèle de recherche peuvent être sélectionnés dans le menu déroulant. L'écran de recherche sera implémenté directement sous l'en-tête, et l'écran d'affichage des résultats de recherche créera une nouvelle vue. Je suis un nouveau venu environ un mois après avoir commencé à étudier les rails, alors s'il vous plaît, manquez toute expression ou description étrange ... (ou indiquez-le dans la question)
ruby '2.6.3' gem 'rails', '~> 5.2.4', '>= 5.2.4.3' gem'bootstrap-sass ',' ~> 3.3.6 '(non requis)
Veuillez créer le modèle utilisateur et le modèle de publication à l'avance. J'ai implémenté Devise.
Sur le site publié par l'utilisateur, entrez les trois entrées suivantes dans l'en-tête, recherchez et passez à l'écran d'affichage.
① Sélectionnez Recherche d'utilisateur ou recherche de publication (modèle de livre dans mon application) dans le menu déroulant (form_with) (2) Sélectionnez la méthode de sélection comme correspondance exacte, correspondance de préfixe, correspondance de suffixe ou correspondance partielle avec la balise de sélection. ③ Entrez un mot-clé -Afficher les résultats de la recherche dans View (permet de modifier le contenu d'affichage des résultats de la recherche avec une instruction if)
$ rails g controller Search search
<détails> <résumé> ** Explication (clic) ** </ résumé> Je crée également une action de recherche </ details>
routes.rb
get '/search' => 'search#search'
<détails> <résumé> ** Explication (clic) ** </ résumé> -L'auteur rend la partie d'en-tête partielle, mais je pense qu'elle peut être mise en œuvre sans problème si vous décrivez ce qui suit dans application.html.erb, et je pense qu'il peut également être implémenté en le décrivant dans une vue spécifique.
_header.html.erb
*Le code au-dessus de cette ligne est omis
<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({ "Correspondance parfaite" => "match", "Correspondance de préfixe" => "forward", "Match en arrière" => "backward", "Match partiel" => "partical" }) %>
<%= f.submit :"Chercher" %>
<% end %>
<% end %>
</div>
</div>
<détails> <résumé> ** Explication (cliquez) ** </ résumé>
search_controller.rb
class SearchController < ApplicationController
def search
@model = params["search"]["model"] #Sélectionnez le modèle@Attribuer au modèle
@value = params["search"]["value"] #Chaîne de caractères recherchée(Ici valeur)À@Attribuer à la valeur
@how = params["search"]["how"] #Sélectionnez la méthode de recherche comment@Attribuer à comment
@datas = search_for(@how, @model, @value) #search_Définir la variable d'instance dans pour l'argument
end #@les données contiendront les résultats finaux de la recherche
private
def match(model, value) #def search_Traitement de la correspondance pour
if model == 'user' #Traitement lorsque le modèle est utilisateur
User.where(name: value) #Où trouver un nom qui correspond exactement à la valeur
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) #Les informations définies dans l'action de recherche sont incluses dans l'argument
case how #Le processus de recherche à partir de la branche conditionnelle de quand quel est le contenu du comment de la méthode de recherche
when 'match'
match(model, value) #Dans l'argument de la méthode de recherche(model, value)Est défini
when 'forward' #Par exemple, si comment correspond, procédez au traitement de la correspondance par défaut.
forward(model, value)
when 'backward'
backward(model, value)
when 'partical'
partical(model, value)
end
end
end
#Correspondance de préfixe
Nom du modèle.where("Nom de colonne LIKE?", "valeur%")
#Match en arrière
Nom du modèle.where("Nom de colonne LIKE?", "%valeur")
#Match partiel
Nom du modèle.where("Nom de colonne LIKE?", "%valeur%")
Je vais le décrire dans views / search / search.html.erb
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>
<détails> <résumé> ** Explication (clic) ** </ résumé> Cela ressemble à transformer le contenu de ** @ data ** défini dans le contrôleur avec une instruction if et chaque modèle avec une instruction each. Le nom de la classe est le même que ③ et c'est une description pour le bootstrap. En écrivant ** <% = @ value%> **, la chaîne de caractères recherchée est affichée. </ détails>
J'ai mis du temps à comprendre le flux de processus du contrôleur (même si je ne le comprends toujours pas parfaitement) J'ai senti qu'il serait plus facile de comprendre si je créais un point d'arrêt dans le contrôleur en utilisant une fonction telle que byebug et vérifiais le contenu de la variable dans le terminal, alors essayez-le. Il y a beaucoup de description dans le contrôleur, alors pardonnez-moi! Veuillez vous y référer si vous le souhaitez ☟ [Mon article sur la fonction DM x Ajax] (https://qiita.com/IsakiMatsuo/items/9923d0724c69a2dfa259)
Recommended Posts