如何在我的 rails 应用程序的“赞”索引页面上点赞一首曲目并查看所有点赞的曲目?

How to like a track and view all liked tracks on my Like index page in my rails app?

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

当用户单击“心形”图标时,我尝试使用具有两个隐藏字段的 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

这是我加入table在曲目和喜欢之间

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

曲目应呈现在“赞”(index.html.erb) 的索引页上。

谢谢,希望我提供的代码不会矫枉过正。如果您需要对此进行更新,请告诉我!post!

是的,你的逻辑有点奇怪,你可以通过以下方式简化一切:

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

现在你只需要在用户点击“心”按钮时创建一个新的赞记录,它应该将 track_iduser_id 作为你表单背后的参数。