-Seules les critiques peuvent s'inscrire en tant que favoris
Créez une table préférée pour stocker quels messages et qui les a aimés.
rails g model like
db/migrate/20XXXXXXXXXXXX_create_likes.rb
class CreateLikes < ActiveRecord::Migration[6.0]
def change
create_table :likes do |t|
t.references :user, null: false, foreign_key: true
t.references :post, null: false, foreign_key: true
t.timestamps
t.index [:user_id, :post_id], unique: true #Empêcher le même utilisateur d'aimer le même message
end
end
end
Utilisez l'option ** dépendante :: détruire ** pour vous assurer que vos favoris sont supprimés lorsque le message est supprimé. Décrivez dans le modèle parent.
app/models/likei.rb
class Like < ApplicationRecord
belongs_to :user
belongs_to :post
end
app/models/post.rb
class Post < ApplicationRecord
belongs_to :user
has_many :likes, dependent: :destroy
has_one_attached :image
~Abréviation~
end
app/models/user.rb
class User < ApplicationRecord
~Abréviation~
has_many :posts
has_many :likes
has_one_attached :image
end
Nous utilisons l'imbrication de routage car nous devons indiquer quel article nous aimons. J'aimerais pouvoir m'inscrire et supprimer mes favoris, alors définissez les options "créer une action" et "détruire l'action".
ruby:config.routes.rb
Rails.application.routes.draw do
devise_for :users
root 'posts#top'
resources :posts do
collection do
get 'top'
end
resources :likes, only: [:create, :destroy]
end
resources :users, only: [:show]
end
Définissez une "action de création" et une "action de destruction" sur le contrôleur. Les favoris peuvent être enregistrés par toute personne autre que l'affiche.
app/controllers/likes_controller.rb
class LikesController < ApplicationController
def create
@post = Post.find(params[:post_id])
if @post.user_id != current_user.id #Vous pouvez ajouter des favoris autres que vos propres messages
@like = Like.create(user_id: current_user.id, post_id: @post.id)
end
end
def destroy
@post = Post.find(params[:post_id])
@like = Like.find_by(user_id: current_user.id, post_id: @post.id)
@like.destroy
end
end
Les messages que l'utilisateur a enregistrés comme favoris sont affichés sur Ma page. Recherchez dans la table Likes le favori de l'utilisateur connecté, triez-les par ordre décroissant et récupérez le post_id sous la forme d'un tableau. Les données sont stockées dans @likes par la méthode find.
app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
birthday = @user.birthday
date_format = "%Y%m%d"
@age = (Date.today.strftime(date_format).to_i - birthday.strftime(date_format).to_i) / 10000
@posts = @user.posts.order(created_at: :desc)
likes = Like.where(user_id: current_user.id).order(created_at: :desc).pluck(:post_id)
@likes = Post.find(likes)
end
end
Créez un modèle partiel pour afficher la pièce où le bouton favori est affiché. Il se branche selon qu'il est enregistré comme favori avec l'instruction if ou non.
ruby:app/views/posts/show.html.erb
~Abréviation~
<div class='star-btn' id="like_<%= @post.id %>">
<%= render "likes/like", post: @post %>
</div>
~Abréviation~
ruby:app/views/likes/_like.html.erb
<% if !Like.exists?(user_id: current_user.id, post_id: post.id) %>
<%= link_to post_likes_path(post.id), method: :post, remote: true, class:"like-btn" do %>
<i class="fas fa-star star-icon1"></i>
<% end %>
<span class="star-count1"><%= post.likes.count %></span>
<% else %>
<%= link_to post_like_path(post_id: post.id, id: post.likes[0].id), method: :delete, remote: true, class:"like-btn" do %>
<i class="fas fa-star star-icon2"></i>
<% end %>
<span class="star-count2"><%= post.likes.count %></span>
<% end %>
Lorsque le bouton favori est cliqué, «l'action de création» ou «l'action de destruction» est exécutée, le modèle partiel est mis à jour par la communication Ajax et le bouton de favori s'affiche.
ruby:app/views/likes/create.js.erb
$('#like_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: { post: @post }) %>");
ruby:app/views/likes/destroy.js.erb
$('#like_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: { post: @post }) %>");
La liste des favoris sur Ma page s'affiche en utilisant chaque instruction.
ruby:app/views/users/show.html.erb
<% if @likes.present? %>
<ul class="relative-post-lists">
<% @likes.each do |like| %>
<li class='post-list'>
<%= link_to post_path(like.id) do %>
<div class='post-img-content'>
<%= image_tag like.image, class: "post-img" %>
</div>
<div class='relative-post-name'>
Nom du produit:<%= like.name %>
</div>
<div class='relative-item-price'>
<span><%= like.price %>Cercle(taxe inclu)</span>
</div>
<div class="relative-post-evaluation">
<span>Évaluation:</span>
<span id="star-rate-<%= like.id %>"></span>
<script>
$('#star-rate-<%= like.id %>').raty({
size: 36,
starOff: "<%= asset_path('star-off.png') %>",
starOn: "<%= asset_path('star-on.png') %>",
starHalf: "<%= asset_path('star-half.png') %>",
half: true,
readOnly: true,
score: <%= like.evaluation %>,
});
</script>
<%= like.evaluation %>
</div>
<div class='user-img-content'>
<%= image_tag like.user.image ,class:"mini-img" if like.user.image.attached? %>
<%= link_to like.user.nickname, user_path(like.user.id) %>
</div>
<div class="relative-post-date">
Date de mise à jour:<%= like.created_at.strftime("%Y.%m.%d") %>
</div>
<% end %>
</li>
<% end %>
</ul>
<% end %>
https://qiita.com/manbolila/items/43a04e8d0d5018cf7f62 https://qiita.com/naberina/items/c6b5c8d7756cb882fb20 https://qiita.com/naota7118/items/e009eff939b5a764672d
Recommended Posts