我一直在爭取這一段時間,我無法弄清楚。我有一個使用設計的用戶模型。用戶可以上傳歌曲,並添加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網址字符串)創建並保存沒有問題。歌曲完全一樣,基本上似乎只是更新用戶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
Playlist.rb
class Playlist < ActiveRecord::Base
belongs_to :user
has_many :songs, :dependent => :destroy
accepts_nested_attributes_for :songs
end
song.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
感謝您對這樣的深度回答。我嘗試過各種形式,並遇到很多錯誤。目前我已經用歌曲清除了播放列表和嵌套資源。用戶現在擁有視頻和歌曲。我可以從註冊編輯頁面成功創建新視頻,因爲表單會從視頻控制器中觸發。當我嘗試提交上傳歌曲表單時,歌曲控制器不會被解僱,只是註冊控制器(我不明白爲什麼)。對於我的設置,我不認爲我真的需要嵌套的資源,只是在其他控制器中使用表單的能力。 –
最後我放棄了。我無法以這種方式獲得歌曲。視頻很好,我無法找到兩個模型之間的任何區別,所以我不明白爲什麼它不起作用。對於歌曲,我剛剛在註冊編輯視圖中呈現了部分表單,並且按照需要運行。 –
NO。你絕不能阻止它。你甚至沒有嘗試過。你現在在嗎?讓我們跳進聊天並完成它 –