[Ruby on Rails] Fonction de recherche (modèle, formule de sélection de méthode)

Cible

search.gif

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

couler

1 Créer un contrôleur 2 Modification du routage 2 Créer une vue

Cette fois, nous procéderons en sélectionnant un modèle et en effectuant une recherche.

Créer un contrôleur

Terminal


$ rails g controller searchs

rb:app/controllers/searchs.controller.rb


class SearchsController < ApplicationController
  def search
    @model = params["model"]
    @content = params["content"]
    @method = params["method"]
    @records = search_for(@model, @content, @method)
  end

  private
  def search_for(model, content, method)
    if model == 'user'
      if method == 'perfect'
        User.where(name: content)
      else
        User.where('name LIKE ?', '%'+content+'%')
      end
    elsif model == 'post'
      if method == 'perfect'
        Post.where(title: content)
      else
        Post.where('title LIKE ?', '%'+content+'%')
      end
    end
  end
end

Le code avec le supplément ajouté est le suivant.

rb:app/controllers/searchs.controller.rb


class SearchsController < ApplicationController
  def search
    #voir le formulaire_Au tag
    #La valeur du modèle sélectionné@Affecté au modèle.
    @model = params["model"]
    #La valeur de la méthode de recherche sélectionnée@Attribuer à la méthode.
    @method = params["method"]
    #Rechercher un mot@Attribuer au contenu.
    @content = params["content"]
    # @model, @content, @Méthode de substitution,
    # search_pour@Attribuer aux enregistrements.
    @records = search_for(@model, @content, @method)
  end

  private
  def search_for(model, content, method)
    #Si le modèle sélectionné est l'utilisateur
    if model == 'user'
      #Si la méthode de recherche sélectionnée correspond exactement
      if method == 'perfect'
        User.where(name: content)
      #Si la méthode de recherche sélectionnée est une correspondance partielle
      else
        User.where('name LIKE ?', '%'+content+'%')
      end
    #Si le modèle sélectionné est post
    elsif model == 'post'
      if method == 'perfect'
        Post.where(title: content)
      else
        Post.where('title LIKE ?', '%'+content+'%')
      end
    end
  end
end


Modifier le routage

config/routes.rb


get '/search', to: 'searchs#search'

Créer une vue

Cette fois, j'ai utilisé un modèle partiel. Le modèle partiel suivant peut être utilisé avec <% = render'searchs / form '%>.

Modèle partiel de boîte de recherche

erb:app/views/searchs/_form.html.erb


<% if user_signed_in? %>
    <%= form_tag(search_path, method: :get) do %>
      <%= text_field_tag 'content' %>
      <%= select_tag 'model', options_for_select({ "User" => "user", "Post" => "post" }) %>
      <%= select_tag 'method', options_for_select({ "Correspondance parfaite" => "perfect", "Match partiel" => "partial" }) %>
      <%= submit_tag 'Chercher' %>
    <% end %>
<% end %>
Supplément [form_tag] Une méthode d'assistance qui vous permet de créer facilement le HTML requis pour votre formulaire de saisie. Cet emplacement d'installation.

app/views/homes/mypage


...

<%= render 'searchs/form' %>

...

Écran d'affichage des résultats de la recherche

erb:app/views/searchs/search.html.erb


<% if @model == 'user' %>
  <h3>[Résultats de la recherche du modèle des utilisateurs] Mot de recherche:<%= @content %></h3>
  <%= render 'users/index', users: @records %>
<% else @model == 'posts' %>
  <h3>[Publie les résultats de la recherche du modèle] Mot de recherche:<%= @content %></h3>
    <%= render 'posts/index', posts: @records %>
<% end %>

Contenu du modèle partiel

erb:app/views/posts/_index.html.erb


<table>
	<thead>
		<tr>
			<th>Publié par nom</th>
			<th>Titre</th>
			<th>Texte</th>
			<th></th>
			<th></th>
			<th></th>
		</tr>
	</thead>
	<tbody id="post">
    <% posts.each do |post| %>
      <tr>
        <td><%= post.user.name %></td>
        <td><%= post.title %></td>
        <td><%= post.body %></td>
        <td><%= link_to "Détails", post_path(post) %></td>
        <% if post.user == current_user %>
          <td><%= link_to "Éditer", edit_post_path(post) %></td>
          <td><%= link_to "Effacer", post_path(post), method: :delete, remote: true %></td>
        <% else %>
          <td></td>
          <td></td>
        <% end %>
      </tr>
    <% end %>
	</tbody>
</table>

erb:app/views/books/_users.html.erb


<% users.each do |user| %>
  <%= link_to user_path(user) do %>
    <%= user.name %><br>
  <% end %>
<% end %>

Recommended Posts