App: SNS où vous pouvez partager des photos et des informations sur les magasins de ramen avec vos amis Ruby: 2.6.5 Rails: 5.2.0
Utilisez form_with pour transmettre le mot de recherche à l'action de recherche de posts_controller.
erb:app/views/layouts/_header.html.erb
・
・
・
<div class="post_search">
<%= form_with url: search_posts_path, method: :get, local: true do |f| %>
<%= f.text_field :search, class: 'form-control', placeholder: "Recherche par mot clé" %>
<%= f.button :type => "submit" do %>
<i class="fas fa-search"></i>
<% end %>
<% end %>
</div>
・
・
・
En créant routes.rb comme suit, L'envoi d'une requête get à l'URL / posts / search (search_posts_path) vous dirigera vers l'action de recherche de posts_controller.
config/routes.rb
~
~
resources :posts, only: [:new, :create, :edit, :show, :update, :destroy] do
get :search, on: :collection
end
~
~
posts_controller Définissez les articles qui correspondent au mot recherché avec @posts.
app/controllers/posts_controller.rb
~
~
def search
@section_title = "「#{params[:search]}Résultats de recherche"
@posts = if params[:search].present?
Post.where(['shop_name LIKE ? OR nearest LIKE ?',
"%#{params[:search]}%", "%#{params[:search]}%"])
.paginate(page: params[:page], per_page: 12).recent
else
Post.none
end
end
~
~
Reçoit le mot de recherche transmis depuis form_with dans les paramètres [: search]. La méthode where renvoie tous les enregistrements qui correspondent à la condition à partir de la table. (S'il n'y a pas de mot de recherche, je l'ai défini sur Post.none et je n'ai pas reçu le message.)
Dans la méthode where, comme indiqué ci-dessous
Nom du modèle.where('Nom de colonne= ?', "valeur")
Vous pouvez mettre? Dans le premier argument (appelé espace réservé) et la valeur de la condition dans le second argument. En écrivant de cette manière, il semble qu'il soit possible d'empêcher une attaque appelée injection SQL qui manipule illégalement les données de la base de données.
Le deuxième argument de où est le suivant
"%#{params[:search]}%"
Je mets% avant et après le mot recherché. En faisant cela, même si "plusieurs chaînes de caractères comprenant des caractères vides" sont incluses avant et après le mot recherché Vous pouvez renvoyer un enregistrement avec cette chaîne.
%Jiro%
→ "Jiro" "Ramen Jiro" "Tsukemen Jiro" "Ramen Jiro Hachioji Store" "Jiro Kabukicho Store"
Tous sont applicables.
%Jiro
→ "Jiro", "Ramen Jiro" et "Tsukemen Jiro" sont applicables,
Le "magasin Ramen Jiro Hachioji" et le "magasin Jiro Kabukicho" ne s'appliquent pas.
À partir des deux colonnes shop_name et plus proche en écrivant comme ci-dessous Recherche la chaîne qui correspond au mot recherché et renvoie l'enregistrement.
Post.where(['shop_name LIKE ? OR nearest LIKE ?',
"%#{params[:search]}%", "%#{params[:search]}%"])
Après cela, veuillez afficher @posts dans app / views / posts / search.html.erb.
↓
[Rails] Comment rechercher dans plusieurs colonnes avec un seul formulaire de recherche [[Rails] Utilisez la méthode where pour obtenir les données souhaitées! ](Https://pikawaka.com/rails/where#where%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%9F% BA% E6% 9C% AC% E7% 9A% 84% E3% 81% AA% E4% BD% BF% E3% 81% 84% E6% 96% B9)
Recommended Posts