-Nur Rezensenten können sich als Favoriten registrieren
Erstellen Sie eine Lieblingstabelle, um zu speichern, welche Beiträge und wem sie gefallen haben.
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
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
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
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
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 %>
https://qiita.com/manbolila/items/43a04e8d0d5018cf7f62 https://qiita.com/naberina/items/c6b5c8d7756cb882fb20 https://qiita.com/naota7118/items/e009eff939b5a764672d
Recommended Posts