[RUBY] [Rails] Lieblingsfunktion

Was Sie implementieren möchten

-Nur Rezensenten können sich als Favoriten registrieren

Inhaltsverzeichnis

  1. Erstellen Sie eine Lieblingstabelle
  2. Verein
  3. Routing
  4. Controller
  5. Anzeigen

1. Erstellen Sie eine Lieblingstabelle

Erstellen Sie eine Lieblingstabelle, um zu speichern, welche Beiträge und wem sie gefallen haben.

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   #Verhindern, dass derselbe Benutzer denselben Beitrag mag
    end
  end
end

2. Verein

Verwenden Sie die Option ** abhängig :: zerstören **, um sicherzustellen, dass Ihre Favoriten gelöscht werden, wenn der Beitrag gelöscht wird. Beschreiben Sie im übergeordneten Modell.

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
  ~Abkürzung~
end

app/models/user.rb


class User < ApplicationRecord
 ~Abkürzung~
  has_many :posts
  has_many :likes
  has_one_attached :image
end

3. Routing

Wir verwenden Routing-Verschachtelung, weil wir angeben müssen, welchen Beitrag wir mögen. Ich wünschte, ich könnte meine Favoriten registrieren und löschen, also setze "Aktion erstellen" und "Aktion zerstören".

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. Controller

Definieren Sie auf dem Controller eine "Aktion erstellen" und eine "Aktion zerstören". Favoriten können von anderen Personen als dem Poster registriert werden.

app/controllers/likes_controller.rb


class LikesController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    if @post.user_id != current_user.id   #Sie können andere Favoriten als Ihre eigenen Beiträge hinzufügen
      @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

Die Beiträge, die der Benutzer als Favoriten registriert hat, werden auf Meine Seite angezeigt. Durchsuchen Sie die Likes-Tabelle nach dem Favoriten des angemeldeten Benutzers, sortieren Sie diese in absteigender Reihenfolge und rufen Sie die post_id in Form eines Arrays ab. Die Daten werden von der find-Methode in @likes gespeichert.

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. Anzeigen

Erstellen Sie eine Teilvorlage, um den Teil anzuzeigen, in dem die Favoritenschaltfläche angezeigt wird. Es verzweigt sich je nachdem, ob es in der if-Anweisung als Favorit registriert ist oder nicht.

ruby:app/views/posts/show.html.erb


~Abkürzung~
<div class='star-btn' id="like_<%= @post.id %>">
  <%= render "likes/like", post: @post %>
</div>
~Abkürzung~

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

Wenn Sie auf die Favoritenschaltfläche klicken, wird die Aktion "Aktion erstellen" oder "Aktion zerstören" ausgeführt, die Teilvorlage wird durch Ajax-Kommunikation aktualisiert und die Favoritenschaltfläche wird angezeigt.

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 }) %>");

Die Favoritenliste auf Meine Seite wird mit jeder Anweisung angezeigt.

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'>
Produktname:<%= like.name %>
          </div>
          <div class='relative-item-price'>
            <span><%= like.price %>Kreis(Steuern inklusive)</span>
          </div>
          <div class="relative-post-evaluation">
            <span>Bewertung:</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">
Neues Datum:<%= like.created_at.strftime("%Y.%m.%d") %>
          </div>
        <% end %>
      </li>
    <% end %>
    </ul>
  <% end %>

Referenzlink

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

Recommended Posts

[Rails] Lieblingsfunktion
Hinzufügen der ersten Paginierungsfunktion in Schienen
[Schienen g. Fehler]
Rails Grundlagen
Rails Review 1
Rails API
Schienenmigration
[Rails] first_or_initialize
Schienen Tutry
Über Schienen 6
Schienenfundament
Rails Memorandum
Schienen Tutorial
Schienen Tutry
Deshalb habe ich dieses Mal die Methode "Verknüpfen des Inhalts des Verzeichnisses" übernommen. Ich denke, es wird je nach Zeit und Fall richtig verwendet. Tutorial zu Linux, ln, Linux-Befehlsschienen
[Schienen] erfinden
Schienen Tutry
Schienen Tutorial
Schienen Tipps
Schienenmethode
Schienen Tutorial
Rails Review 2
So implementieren Sie eine ähnliche Funktion in Rails