ruby-on-rails - 如何在我的 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) 的索引页面上呈现。
谢谢并希望我提供的代码不是矫枉过正。如果您需要更新这篇文章,请告诉我!
解决方案
是的,您的逻辑在这里有点奇怪,您可以使用以下内容简化所有内容:
- 删除
Like
模型和数据库表(不知道为什么要在此处附上照片?) - 更改
LikedTrack
属于User
而不是Like
- 重命名
LikedTrack
为Like
现在您只需要在用户单击“心”按钮时创建一个新的 Like 记录,它应该将track_id
anduser_id
作为表单后面的参数。
推荐阅读
- docker - 如何扩展 nginx 但共享相同的卷
- apache-calcite - Dremio 字符集“ISO-8859-1”
- javascript - 在前端翻译消息
- python - 从右起第 4 个分隔符上拆分数据帧
- asp.net-core - 如何在锁内使用异步方法
- mysql - 连接出现多个匹配的 2 个表,并为多个值创建文本列
- c - 如何在C中获取指针数组的元素?
- networking - 了解 'dig google.com' 命令
- c - C头文件如何导入win32api函数?
- wordpress - 带有 WooCommerce 扩展的 WP Webhooks Pro 不发送订单项