[RUBY] [Rails] Fonction préférée

Ce que vous souhaitez mettre en œuvre

-Seules les critiques peuvent s'inscrire en tant que favoris

table des matières

  1. Créer une table préférée
  2. Association
  3. Routage
  4. Contrôleur
  5. Afficher

1. Créer une table préférée

Créez une table préférée pour stocker quels messages et qui les a aimés.

Terminal
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

2. Association

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

3. Routage

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

4. Contrôleur

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

5. Afficher

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 %>

Lien de référence

https://qiita.com/manbolila/items/43a04e8d0d5018cf7f62 https://qiita.com/naberina/items/c6b5c8d7756cb882fb20 https://qiita.com/naota7118/items/e009eff939b5a764672d

Recommended Posts

[Rails] Fonction préférée
Ajout de la première fonction de pagination dans les rails
[Rails g. Erreur]
Notions de base sur les rails
Rails Examen 1
API Rails
Migration des rails
[Rails] first_or_initialize
rails tutry
À propos des rails 6
Fondation Rails
Mémorandum Rails
tutoriel sur les rails
rails tutry
tutoriel sur les rails
[Rails] concevoir
rails tutry
tutoriel sur les rails
Conseils de rails
méthode des rails
tutoriel sur les rails
Rails Revue 2
Comment implémenter une fonctionnalité similaire dans Rails