【发布时间】:2023-03-19 22:15:01
【问题描述】:
我已经与这个问题斗争了一段时间,但我无法弄清楚。我有一个使用设计的用户模型。用户可以上传歌曲,添加 youtube 视频等。
我试图让用户从设计edit registrations 视图中添加/删除歌曲和视频。
视频上传正常,但由于歌曲是播放列表的嵌套资源,属于用户,我想我有点糊涂了。
音乐在其相应页面上以相同的形式上传,但不是来自设计registration edit 视图。
路线:
devise_for :users, controllers: { registrations: "users/registrations", sessions: "users/sessions" }
resources :videos
resources :playlists do
resources :songs
end
设计注册控制器:
def edit
@song = Song.new
@video = Video.new
end
设计编辑注册中的表格:
<div id="user-music-box">
<p class="p-details-title"> Upload Music </p>
<%= simple_form_for [@user.playlist, @song] do |f| %>
<%= f.file_field :audio %>
<%= f.button :submit %>
<% end %>
</div>
<div id="user-video-box">
<p class="p-details-title"> Add videos </p>
<%= simple_form_for @video do |f| %>
<%= f.input :youtubeurl %>
<%= f.button :submit %>
<% end %>
</div>
正如我所说,视频(这是一个 youtube url 字符串)创建和保存没有问题。歌曲的形式完全相同,基本上似乎只是更新用户registration。歌曲信息显示在服务器日志中,但没有 playlist_id 存在,也没有保存任何内容。
歌曲控制器:
def new
if user_signed_in?
@song = Song.new
if current_user.playlist.songs.count >= 5
redirect_to user_path(current_user)
flash[:danger] = "You can only upload 5 songs."
end
else
redirect_to(root_url)
flash[:danger] = "You must sign in to upload songs"
end
end
def create
@song = current_user.playlist.songs.new song_params
@song.playlist_id = @playlist.id
if @song.save
respond_to do |format|
format.html {redirect_to user_path(current_user)}
format.js
end
else
render 'new'
end
end
播放列表.rb
class Playlist < ActiveRecord::Base
belongs_to :user
has_many :songs, :dependent => :destroy
accepts_nested_attributes_for :songs
end
歌曲.rb
class Song < ActiveRecord::Base
belongs_to :user
belongs_to :playlist
has_attached_file :audio
validates_attachment_presence :audio
validates_attachment_content_type :audio, :content_type => ['audio/mp3','audio/mpeg']
end
【问题讨论】:
标签: ruby-on-rails devise simple-form nested-resources