Implementieren Sie die Auswahl der Pulldown-Bedingungen für die genaue Übereinstimmung, Präfixübereinstimmung, Suffixübereinstimmung und Teilübereinstimmung mit den beiden Modellen, die Sie im Suchformular suchen möchten. (Referenzbild) 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>
Da wir dieses Mal kein Modell erstellen, erstellen wir nur den Controller und die Ansicht
Führen Sie mit dem Befehl Rails G Controller Seraches Search
aus.
Fügen Sie "get'users / search" => "search # search" zu "route.rb" hinzu
views/Ansicht Ich möchte das Suchformular ausfüllen
<%= form_tag(users_search_path, method: :get) do %>
<%= text_field_tag 'search[content]' %>
<%= select_tag 'search[model]', options_for_select({ "Nutzer" => "user", "Etikett" => "muscle" }) %>
<%= select_tag 'search[how]', options_for_select({ "Perfekte Übereinstimmung" => "match", "Präfixübereinstimmung" => "forward", "Rückwärtsspiel" => "backward", "Teilweise Übereinstimmung" => "partical" }) %>
<%= submit_tag 'Suche', 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
Da ich die Spalte work_tag der Tabelle Muscles und die Spalte name der Tabelle Users durchsuche, ändern Sie sie bitte für jede Person.
@content = params['search']['content']
@how = params['search']['how']
@model = params['search']['model']
@datas = search_for(@how, @model, @content)
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'
ist eine exakte Übereinstimmung, und' partcial'
ist eine teilweise Übereinstimmung, wie Sie anhand von form_tag sehen können.
-Wenn der Inhalt der case-Anweisung "match" ist, wird die match-Methode in der serach_for-Methode aufgerufen.
def match(model, content)
if model == 'user'
User.where(name: content)
elsif model == 'muscle'
Muscle.where(work_tag: content)
end
end
-In der aufgerufenen Match-Methode ist der Inhalt des gespeicherten Modells abhängig davon, ob es sich um einen Benutzer oder einen Muskel handelt.
rails:views/seaches/searche.html.erb
<% if @model == "user" %>
<div class="row justify-content-center">
<h2>Benutzerliste</h2>
</div>
<div class="row justify-content-center">
<% @datas.each do |datas| %>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Nutzername</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>Tag-Liste</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<%= link_to datas.work_tag, muscle_path(datas.id) %>
</td>
</tr>
</tbody>
</table>
</div>
<% else %>
<% end %>
Wenn Sie die Methode verstehen, können Sie sie problemlos ohne Edelstein implementieren. Bitte kommentieren Sie, wenn etwas fehlt oder unklar ist.