如何在我的 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!
是的,你的逻辑有点奇怪,你可以通过以下方式简化一切:
- 删除
Like
模型和数据库 table(不确定为什么要在此处附上照片?)
- 更改
LikedTrack
属于 User
而不是 Like
- 将
LikedTrack
重命名为 Like
现在你只需要在用户点击“心”按钮时创建一个新的赞记录,它应该将 track_id
和 user_id
作为你表单背后的参数。
我正在构建一个音乐流媒体应用程序并且正忙于点赞功能。流程是用户看到曲目列表然后喜欢曲目。然后,用户导航到“喜欢”页面,他们可以在其中看到他们喜欢的所有曲目。
当用户单击“心形”图标时,我尝试使用具有两个隐藏字段的 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!
是的,你的逻辑有点奇怪,你可以通过以下方式简化一切:
- 删除
Like
模型和数据库 table(不确定为什么要在此处附上照片?) - 更改
LikedTrack
属于User
而不是Like
- 将
LikedTrack
重命名为Like
现在你只需要在用户点击“心”按钮时创建一个新的赞记录,它应该将 track_id
和 user_id
作为你表单背后的参数。