Cette fois, les données de publication (Post) sont affichées en effectuant une recherche par mot-clé dans la barre de recherche. En outre, nous allons joindre plusieurs tables et les implémenter afin qu'elles puissent être recherchées dans cette plage.
MacOS 10.15.7 ruby 2.6.5 Ruby on Rails 6.0.0
Nous avons créé un tableau avec l'utilisateur comme "Utilisateur", le message comme "Publier", l'image comme "Image" et la préfecture comme "Préfecture" (données de départ). (Le contenu du tableau est simplifié pour l'affichage)
Les relations sont les suivantes.
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
Ça ressemble à ça. J'ai également présenté l'utilisateur et l'image, mais cette fois j'omettrai l'explication car ils ne sont pas liés. Puisque la préfecture a plusieurs messages, il est défini comme "has_many: posts". Puisque le poste appartient à la préfecture, il sera "appartient à: préfecture".
Créez une barre de recherche de cette manière.
erb:index.html.erb
<%= form_with(url: search_posts_path, local: true, method: :get, class: "rootpageSearchForm") do |form| %>
<%= form.text_field :keyword, placeholder: "Entrez un mot-clé", id: 'Search_Form', class: "rootpageSearchForm__content" %>
<%= form.submit "Chercher", 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;
}
}
C'est tout. L'image terminée ressemble à ceci.
Définissez une nouvelle action de recherche dans routes.rb. Cette fois, nous le définirons sous une forme imbriquée dans l'action de publication. Il est défini comme suit.
routes.rb
Rails.application.routes.draw do
resources :posts do
collection do
get 'search'
end
end
Certains des éléments suivants sont omis...
end
Cette fois, les publications correspondantes sont affichées sous forme de liste avec le mot-clé de recherche, donc l'identifiant n'est pas nécessaire.
collection do
get 'search'
end
Est défini comme.
Si vous avez besoin d'un identifiant (comme une page de détails de publication), utilisez un membre au lieu d'une collection pour le définir. La différence entre collection et membre est de savoir si l'URL a un identifiant ou non.
collection ・ ・ ・ Aucun identifiant n'est attaché au routage. membre ・ ・ ・ Un identifiant est attaché au routage.
class Post < ApplicationRecord
...Partie de ce qui précède omise
def self.search(search)
if search != ""
Post.where('content LIKE(?) OR title LIKE(?), "%#{search}%", "%#{search}%")
else
Post.all
end
end
Certains des éléments suivants sont omis...
end
Utilisez la méthode where
pour obtenir" l'instance de l'enregistrement qui correspond à la condition "sous la forme d'un tableau basé sur la condition décrite dans l'argument.
J'utilise la clause LIKE pour rechercher des chaînes ambiguës.
Chaîne | sens |
---|---|
% | Chaîne de caractères arbitraire (y compris la chaîne de caractères vide) |
_ | N'importe quel personnage |
Exemple d'exécution
Exemple d'exécution | sens |
---|---|
where('title LIKE(?)', "a%") | Titres commençant par un |
where('title LIKE(?)', "%b") | Titres se terminant par b |
where('title LIKE(?)', "d_") | Titres contenant c |
where('title LIKE(?)', "%b") | Titre à deux lettres commençant par d |
where('title LIKE(?)', "_e") | Titre à deux lettres se terminant par e |
La recherche d'argument contient les paramètres envoyés depuis le formulaire de recherche.
Par conséquent, écrivez if search! =" "
, Et la condition est qu'une valeur soit entrée dans le formulaire de recherche.
Si le bouton de recherche est enfoncé alors que rien n'est entré dans le formulaire de recherche (état vide), le contenu de la recherche passée à l'argument sera vide, décrivez donc le traitement dans ce cas dans l'instruction else. Cette fois, en tant que «Post.all», tous les messages seront acquis et affichés.
__ Fondamentalement, la méthode d'interaction avec la table est placée dans le modèle! __
Définissez une action de recherche dans posts_controller.rb.
posts_controller.rb
class PostsController < ApplicationController
...Partie de ce qui précède omise...
def search
@posts = Post.search(params[:keyword]).order(created_at: :desc)
end
...Certains des éléments suivants sont omis...
Écrivez params [: mot-clé]
dans l'argument de la méthode de recherche et transmettez le résultat de la recherche.
De plus, étant donné que les résultats de la recherche sont organisés dans l'ordre des articles les plus récents, il est décrit comme order (created_at: desc)
.
Après cela, créez search.html.erb pour afficher l'écran des résultats de la recherche et c'est terminé.
ruby:search.html.erb
<div class="wrapper">
<% @posts.each do |post| %>
<div class='contents row'>
...Omis ci-dessous...
<% end %>
</div>
Vous pouvez maintenant afficher les résultats de la recherche à l'aide de la barre de recherche et de la recherche par mot-clé. Avec les paramètres jusqu'à ce point, le "contenu (texte de l'article)" et le "titre (titre de l'article)" de la table des articles sont recherchés.
Cette fois, je voudrais ajouter "nom (nom de la préfecture)" dans le tableau Préfecture à la cible de recherche afin que vous puissiez également effectuer une recherche par nom de préfecture.
Nous ajouterons une description au modèle de publication.
class Post < ApplicationRecord
...Partie de ce qui précède omise
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
Certains des éléments suivants sont omis...
end
La table prefecture est également ajoutée en tant que «jointures (: prefecture)» à rechercher. La méthode de jointure est une méthode utilisée lorsque vous souhaitez joindre plusieurs tables en une seule. Dans ce cas, la table de publication et la table de préfecture sont jointes et traitées comme une seule table.
Dans la partie argument de la méthode where, OR prefectures.name LIKE (?) '
Est ajouté pour spécifier le nom de la préfecture comme cible de recherche. Ajoutez un "% # {search}% "
pour ce montant et vous avez terminé.
Puisque je suis un débutant, je vous serais reconnaissant si vous pouviez signaler des erreurs. Merci d'avoir regardé jusqu'à la fin.