Lors de la création du portfolio, j'ai implémenté une fonction de recherche, donc je posterai un article en mémo
app/views/tweet/index
= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form|
= form.text_field :keyword, placeholder: "Rechercher des articles", class: "search-input"
= form.submit "Chercher", class: "search-btn"
routes
resources :tweets do
resources :comments, only: :create
collection do #ajouter à
get 'search' #ajouter à
end #ajouter à
~ abrégé ~
end
Il sera affiché comme ci-dessous.
** Dans les rails, il existe des collections et des membres comme moyens de configurer le routage autres que 7 actions **
- | - |
---|---|
collection | Pour le routage:l'identifiant n'est pas joint |
member | Pour le routage:l'identifiant est joint |
** Cette fois, je vais utiliser. ** ** ** Une fois défini, effectuez des itinéraires ferroviaires et voyez par vous-même. ** **
Définissez une méthode de recherche pour la recherche à partir de la table dans le modèle.
Une logique telle que la recherche du point de vue de MVC doit être définie collectivement dans le modèle en tant que méthode.
** Définissez la méthode de recherche dans le modèle Tweet. Utilisez la méthode where et la clause LIKE pour obtenir les publications contenant les mots-clés recherchés. ** **
Ajoutez ce qui suit à app / models / tweet.rb.
def self.search(search)
if search
Tweet.where('text LIKE(?)', "%#{search}%")
else
Tweet.all
end
end
Une des méthodes ActiveRecord. En spécifiant une condition dans la partie argument comme model .where (condition), vous pouvez obtenir une instance de l'enregistrement qui correspond à la condition de la table sous la forme d'un tableau.
Assurez-vous d'inclure la "colonne à rechercher" dans la condition d'argument et de décrire l'expression conditionnelle.
modèle.where('Expression conditionnelle comprenant la colonne à rechercher')
La clause LIKE vous permet de rechercher des chaînes ambiguës et est utilisée avec la méthode where.
Par exemple, lorsque vous souhaitez rechercher des données contenant la chaîne de caractères «a» dans le premier caractère, des données contenant «b» dans le dernier caractère ou des données contenant «c» au milieu de la chaîne de caractères, un caractère ambigu Recherche à l'aide de colonnes.
Exemple d'exécution | Exemple d'exécution |
---|---|
where('title LIKE(?)', "a%") | Titres commençant par un |
where('title LIKE(?)', "%b") | Titres se terminant par b |
where('title LIKE(?)', "%c%") | Titres contenant c |
where('title LIKE(?)', "d_") | Titre à deux lettres commençant par d |
where('title LIKE(?)', "_e") | Titre à deux lettres se terminant par e |
Appelez la méthode de recherche écrite dans le modèle. Les résultats de la recherche sont transmis en écrivant les paramètres [: mot-clé] dans l'argument de la méthode seach.
De plus, la recherche est ajoutée à l'option except de before_action pour éviter d'être redirigé vers la première page lorsque vous n'êtes pas connecté.
app/controllers/tweets_controller.rb
before_action :move_to_index, except: [:index, :show, :search]
def search
@tweets = Tweet.search(params[:keyword])
end
~ abrégé ~
private
def move_to_index
redirect_to action: :index unless user_signed_in?
end
La description est ci-dessous
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: "Rechercher des articles", class: "search-input"
= form.submit "Chercher", class: "search-btn"
.contents.row
- @tweets.each do |tweet|
= render partial: "tweet", locals: { title: tweet }
La description du modèle de partie tweet est la suivante dans mon cas. C'est encore incomplet, mais cela a bien fonctionné ici pour le moment. 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")
Date de mise à jour
- 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
Je pense que vous pouvez l'implémenter maintenant!
Si vous obtenez une erreur, veuillez commenter.
Merci beaucoup!
Recommended Posts