Beim Erstellen des Portfolios habe ich eine Suchfunktion implementiert, sodass ich einen Artikel als Memo veröffentlichen werde
app/views/tweet/index
= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form|
= form.text_field :keyword, placeholder: "Suche nach Beiträgen", class: "search-input"
= form.submit "Suche", class: "search-btn"
routes
resources :tweets do
resources :comments, only: :create
collection do #hinzufügen
get 'search' #hinzufügen
end #hinzufügen
~ Abkürzung ~
end
Es wird wie folgt angezeigt.
** In Rails gibt es Sammlungen und Mitglieder, mit denen andere Routing als 7 Aktionen konfiguriert werden können **
- | - |
---|---|
collection | Zum Weiterleiten:ID ist nicht angehängt |
member | Zum Weiterleiten:ID ist beigefügt |
** Dieses Mal werde ich verwenden. ** **. ** Führen Sie nach der Definition Schienenrouten durch und überzeugen Sie sich selbst. ** **.
Definieren Sie eine Methodensuche für die Suche aus der Tabelle im Modell.
Logik wie das Suchen aus Sicht von MVC sollte im Modell gemeinsam als Methode definiert werden.
** Definieren Sie die Suchmethode im Tweet-Modell. Verwenden Sie die where-Methode und die LIKE-Klausel, um Beiträge abzurufen, die die gesuchten Schlüsselwörter enthalten. ** **.
Fügen Sie der Datei / models / tweet.rb Folgendes hinzu.
def self.search(search)
if search
Tweet.where('text LIKE(?)', "%#{search}%")
else
Tweet.all
end
end
Eine der ActiveRecord-Methoden. Durch Angabe einer Bedingung im Argumentteil wie model .where (Bedingung) können Sie eine Instanz des Datensatzes abrufen, die der Bedingung in der Tabelle in Form eines Arrays entspricht.
Stellen Sie sicher, dass Sie die "zu durchsuchende Spalte" in die Argumentbedingung aufnehmen und den bedingten Ausdruck beschreiben.
Modell-.where('Bedingter Ausdruck einschließlich der zu durchsuchenden Spalte')
Die LIKE-Klausel ermöglicht die Suche nach mehrdeutigen Zeichenfolgen und wird mit der where-Methode verwendet.
Wenn Sie beispielsweise nach Daten suchen möchten, die die Zeichenfolge "a" im ersten Zeichen enthalten, Daten, die "b" im letzten Zeichen enthalten, oder Daten, die "c" in der Mitte der Zeichenfolge enthalten, ein mehrdeutiges Zeichen Suchen mit Spalten.
Ausführungsbeispiel | Ausführungsbeispiel |
---|---|
where('title LIKE(?)', "a%") | Titel beginnend mit a |
where('title LIKE(?)', "%b") | Titel mit der Endung b |
where('title LIKE(?)', "%c%") | Titel mit c |
where('title LIKE(?)', "d_") | Titel aus zwei Buchstaben beginnend mit d |
where('title LIKE(?)', "_e") | Titel aus zwei Buchstaben, der mit e endet |
Rufen Sie die im Modell geschriebene Suchmethode auf. Die Suchergebnisse werden übergeben, indem params [: keyword] in das Argument der seach-Methode geschrieben werden.
Außerdem wird der Ausnahmeoption before_action: search hinzugefügt, um zu vermeiden, dass sie auf die oberste Seite umgeleitet wird, wenn sie nicht angemeldet ist.
app/controllers/tweets_controller.rb
before_action :move_to_index, except: [:index, :show, :search]
def search
@tweets = Tweet.search(params[:keyword])
end
~ Abkürzung ~
private
def move_to_index
redirect_to action: :index unless user_signed_in?
end
Die Beschreibung ist unten
app/views/tweets/search.html.erb
= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form|
= form.text_field :keyword, placeholder: "Suche nach Beiträgen", class: "search-input"
= form.submit "Suche", class: "search-btn"
.contents.row
- @tweets.each do |tweet|
= render partial: "tweet", locals: { title: tweet }
Die Beschreibung der Tweet-Teilvorlage lautet in meinem Fall wie folgt. Es ist immer noch unvollständig, aber hier hat es vorerst gut funktioniert. app/views/tweets/_tweet.html.erb
.users_tweets
- @tweets.each do |tweet|
.users_tweets__lists
.users_tweets__lists_list
.users_tweets__lists_list__tweet_image
= link_to tweet_path(tweet) do
= attachment_image_tag tweet, :image
= tweet.title
.users_tweets__lists_list__user_image
= link_to user_path(tweet.user.id) do
= attachment_image_tag tweet.user, :profile_image, fallback: "no-image.png "
= link_to tweet.user.username,user_path(tweet.user.id)
.users_tweets__lists_list__user_name
= tweet.updated_at.strftime("%Y-%m-%d %H:%M")
Aktualisierungsdatum
- if current_user.already_liked?(tweet)
= link_to tweet_likes_path(tweet), method: :delete do
%i.fas.fa-heart
- else
= link_to tweet_likes_path(tweet), method: :post do
%i.far.fa-heart
= tweet.likes.count
Ich denke, Sie können es jetzt implementieren!
Wenn Sie eine Fehlermeldung erhalten, kommentieren Sie bitte.
Vielen Dank!
Recommended Posts