首页 > 解决方案 > 如何在我的 Rails 应用程序的“喜欢”索引页面上点赞曲目并查看所有喜欢的曲目?

问题描述

我正在构建一个音乐流媒体应用程序,并且忙于喜欢功能。流程是用户看到曲目列表然后喜欢曲目。然后,用户导航到“喜欢”页面,在那里他们可以看到他们喜欢的所有曲目。

当用户单击“心脏”图标时,我正在尝试使用具有两个隐藏字段的simple_form 。一个字段填充了track.id,另一个字段应采用@likes.id。但是,由于用户不应该创建“喜欢播放列表”,因此我没有可用的 likes_id。

正如预期的那样,导航到喜欢页面时出现的错误是找不到没有 ID 的喜欢

问题:谁能澄清我如何创建一个 likes_id 而不必在 new.html.erb 中创建一个?

旁注:用户当前可以创建多个播放列表,并且可以将歌曲添加到所选播放列表中,我尝试按照相同的逻辑来点赞,如果我离开了,我深表歉意。

这是我的路线

resources :likes do
  resources :tracks
end

用户模型

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :validatable

  has_many :playlists
  has_many :tracks
  has_many :albums
  has_many :likes
  has_one_attached :photo
end

喜欢模特

class Like < ApplicationRecord
    has_many :liked_tracks
    has_many :tracks, through: :liked_tracks 
    belongs_to :user
    has_one_attached :photo
end

这是我的曲目和喜欢之间的连接表

class LikedTrack < ApplicationRecord
    belongs_to :like
    belongs_to :track
end

我的足迹模型

class Track < ApplicationRecord
    belongs_to :album
    belongs_to :user
    has_many :playlist_tracks
    has_many :playlists, through: :playlist_tracks
    has_many :likes, through: :liked_tracks
    has_many :tags, through: :tags_tracks
    accepts_nested_attributes_for :playlist_tracks, allow_destroy: true

    validates :title, presence: true, length: { in: 1..20 }
    validates :description, presence: true, length: { in: 10..60 }
    has_one_attached :photo
    has_one_attached :track
end

这是我的点赞控制器

class LikesController < ApplicationController

    def index
        @tracks = LikedTrack.all
    end
    
    def show
        @liked = Like.find(params[:id])
        @tracks = @liked.tracks
    end

    def new
        @liked = Like.new
    end

    def create
        @liked = Like.new(track_params)
        @liked.user = current_user
        if @liked.save!
            redirect_to likes_path(@liked)
        else
            render 'new'
        end
    end

    private

    def track_params
        params.require(:liked_track).permit(:track_id, :like_id)
    end


end

这是我的 LikedTracks 控制器

class LikedTracksController < ApplicationController

    def new
    @liked = Like.new
    end

    def create
    @liked_track = LikedTrack.new(liked_track_params)
        if @liked_track.save!
            redirect_to station_index_path
        else
            render 'new'
        end
    end

    private

    def liked_track_params
        params.require(:liked_track).permit(:track_id, :like_id)
    end

end

这是我到喜欢页面的导航

    <div class="flex">
    <i class="fas fa-heart"></i>
    <%= link_to "Liked", likes_path(current_user), class: "nav-text" %>
    </div>

这是嵌入在每个跟踪卡中的表格

<%= simple_form_for @liked_track, url: liked_tracks_path, method: :post do |f| %>
    <%= f.input :like_id, as: :hidden, input_html: { value: DESIRED @likes.id} %>
    <%= f.input :track_id, as: :hidden, input_html: { value: track.id } %>
    <%= button_tag type: 'submit', class: "like-button", id: "like-button" do %>
        <i class="fas fa-heart"></i>
<% end %>

曲目应在 Likes (index.html.erb) 的索引页面上呈现。

谢谢并希望我提供的代码不是矫枉过正。如果您需要更新这篇文章,请告诉我!

标签: ruby-on-railsrubysocial-likes

解决方案


是的,您的逻辑在这里有点奇怪,您可以使用以下内容简化所有内容:

  1. 删除Like模型和数据库表(不知道为什么要在此处附上照片?)
  2. 更改LikedTrack属于User而不是Like
  3. 重命名LikedTrackLike

现在您只需要在用户单击“心”按钮时创建一个新的 Like 记录,它应该将track_idanduser_id作为表单后面的参数。


推荐阅读