Implémentez la sélection de conditions déroulantes de correspondance exacte, de correspondance de préfixe, de correspondance de suffixe et de correspondance partielle avec les deux modèles que vous souhaitez rechercher dans le formulaire de recherche. (Image de référence) http://drive.google.com/uc?export=view&id=1vsAOuXvOIV1IzDxaPhUJ0rLL0V0AgPUC
<img src=https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F700999%2Fa126f999-9e5e-f80c-913d-e7ee2c86652a.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=b85b97e43acfbe1b95ec86c20570bce4>
Comme nous ne créerons pas de modèle cette fois, nous créerons uniquement le contrôleur et afficherons
Exécutez rails g controller Seraches search
avec la commande.
Ajoutez get'users / search '=>' recherches # search'
à routes.rb
views/Afficher Je souhaite remplir le formulaire de recherche
<%= form_tag(users_search_path, method: :get) do %>
<%= text_field_tag 'search[content]' %>
<%= select_tag 'search[model]', options_for_select({ "utilisateur" => "user", "marque" => "muscle" }) %>
<%= select_tag 'search[how]', options_for_select({ "Correspondance parfaite" => "match", "Correspondance de préfixe" => "forward", "Match en arrière" => "backward", "Match partiel" => "partical" }) %>
<%= submit_tag 'Chercher', class: "btn btn-primary" %>
<% end %>
users/searches_controller.rb
def search
@content = params['search']['content']
@how = params['search']['how']
@model = params['search']['model']
@datas = search_for(@how, @model, @content)
end
private
def match(model, content)
if model == 'user'
User.where(name: content)
elsif model == 'muscle'
Muscle.where(work_tag: content)
end
end
def forward(model, content)
if model == 'user'
User.where('name LIKE ?', "#{content}%")
elsif model == 'muscle'
Muscle.where('work_tag LIKE ?', "#{content}%")
end
end
def backward(model, content)
if model == 'user'
User.where('name LIKE ?', "%#{content}")
elsif model == 'muscle'
Muscle.where('work_tag LIKE ?', "%#{content}")
end
end
def partical(model, content)
if model == 'user'
User.where('name LIKE ?', "%#{content}%")
elsif model == 'muscle'
Muscle.where('work_tag LIKE ?', "%#{content}%")
end
end
def search_for(how, model, content)
case how
when 'match'
match(model, content)
when 'forward'
forward(model, content)
when 'backward'
backward(model, content)
when 'partical'
partical(model, content)
end
end
end
Puisque je recherche la colonne work_tag de la table Muscles et la colonne nom de la table Users, veuillez les modifier pour chaque individu.
@content = params['search']['content']
@how = params['search']['how']
@model = params['search']['model']
@datas = search_for(@how, @model, @content)
-Tout d'abord, lorsque l'utilisateur exécute une recherche à partir de la vue où form_tag est installé, search_controller est appelé et le contenu de la recherche envoyé depuis la vue est stocké dans @content. ・ Conditions de stockage telles que la correspondance exacte envoyée depuis la vue dans @how ・ Stockez le modèle que vous souhaitez rechercher, tel que l'utilisateur envoyé depuis la vue, dans @model -Invoquez la méthode search_for à @datas et passez (@how, @model, @content) comme argument.
def search_for(how, model, content)
case how
when 'match'
match(model, content)
when 'forward'
forward(model, content)
when 'backward'
backward(model, content)
when 'partical'
partical(model, content)
end
end
・ 'Match' 'est une correspondance exacte et
partcial' 'est une correspondance partielle, comme vous pouvez le voir en regardant form_tag.
-Lorsque le contenu du how dans l'instruction case est `` 'match' ', la méthode match est appelée dans la méthode serach_for.
def match(model, content)
if model == 'user'
User.where(name: content)
elsif model == 'muscle'
Muscle.where(work_tag: content)
end
end
-Dans la méthode de correspondance appelée, le contenu du modèle stocké est conditionnel selon qu'il s'agit d'un utilisateur ou d'un muscle. -Bien sûr, puisqu'il s'agit d'une correspondance exacte, dans le cas de User, tout ce qui correspond aux colonnes de contenu et de nom envoyées depuis le formulaire dans ʻUser.where` est acquis. -La méthode de correspondance est maintenant exécutée et le résultat est stocké dans @datas.
rails:views/seaches/searche.html.erb
<% if @model == "user" %>
<div class="row justify-content-center">
<h2>Liste d'utilisateur</h2>
</div>
<div class="row justify-content-center">
<% @datas.each do |datas| %>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Nom d'utilisateur</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<%= link_to datas.name, user_path(datas.id) %>
</td>
</tr>
</tbody>
</table>
<% end %>
</div>
<% elsif @model == "muscle"%>
<div class="row justify-content-center">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Liste de balises</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<%= link_to datas.work_tag, muscle_path(datas.id) %>
</td>
</tr>
</tbody>
</table>
</div>
<% else %>
<% end %>
-Changez le html à afficher selon que le modèle est utilisateur ou muscle dans l'instruction if. -Tournez les éléments stockés dans @datas à chaque fois pour les afficher dans une liste.
Si vous comprenez la méthode, vous pouvez facilement l'implémenter sans gemme. Veuillez commenter si quelque chose manque ou n'est pas clair
Recommended Posts