[Ruby on Rails] Suchfunktion (Modell, Methodenauswahlformel)

Ziel

search.gif

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

fließen

1 Erstellen Sie einen Controller 2 Routing bearbeiten 2 Ansicht erstellen

Dieses Mal werden wir ein Modell auswählen und suchen.

Controller erstellen

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

Der Code mit der hinzugefügten Ergänzung lautet wie folgt.

rb:app/controllers/searchs.controller.rb


class SearchsController < ApplicationController
  def search
    #Formular anzeigen_Am Tag
    #Der Wert des ausgewählten Modells@Dem Modell zugeordnet.
    @model = params["model"]
    #Der Wert der ausgewählten Suchmethode@Methode zuweisen.
    @method = params["method"]
    #Suchbegriff@Inhalt zuweisen.
    @content = params["content"]
    # @model, @content, @Substituierte Methode,
    # search_zum@Datensätzen zuordnen.
    @records = search_for(@model, @content, @method)
  end

  private
  def search_for(model, content, method)
    #Wenn das ausgewählte Modell Benutzer ist
    if model == 'user'
      #Wenn die ausgewählte Suchmethode genau übereinstimmt
      if method == 'perfect'
        User.where(name: content)
      #Wenn die ausgewählte Suchmethode teilweise übereinstimmt
      else
        User.where('name LIKE ?', '%'+content+'%')
      end
    #Wenn das ausgewählte Modell post ist
    elsif model == 'post'
      if method == 'perfect'
        Post.where(title: content)
      else
        Post.where('title LIKE ?', '%'+content+'%')
      end
    end
  end
end


Routing bearbeiten

config/routes.rb


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

Ansicht erstellen

Diesmal habe ich eine Teilvorlage verwendet. Die folgende Teilvorlage kann mit <% = render'searchs / form '%> verwendet werden.

Suche BOX Teilvorlage

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({ "Perfekte Übereinstimmung" => "perfect", "Teilweise Übereinstimmung" => "partial" }) %>
      <%= submit_tag 'Suche' %>
    <% end %>
<% end %>
Ergänzung [form_tag] Eine Hilfsmethode, mit der Sie auf einfache Weise den erforderlichen HTML-Code für Ihr Eingabeformular erstellen können. Dieser Installationsort.

app/views/homes/mypage


...

<%= render 'searchs/form' %>

...

Anzeigebildschirm für Suchergebnisse

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


<% if @model == 'user' %>
  <h3>[Benutzermodell Suchergebnisse] Suchwort:<%= @content %></h3>
  <%= render 'users/index', users: @records %>
<% else @model == 'posts' %>
  <h3>[Beiträge Modellsuchergebnisse] Suchwort:<%= @content %></h3>
    <%= render 'posts/index', posts: @records %>
<% end %>

Inhalt der Teilvorlage

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


<table>
	<thead>
		<tr>
			<th>Gepostet mit Namen</th>
			<th>Titel</th>
			<th>Text</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 "Einzelheiten", post_path(post) %></td>
        <% if post.user == current_user %>
          <td><%= link_to "Bearbeiten", edit_post_path(post) %></td>
          <td><%= link_to "Löschen", 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