Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails。不同视图中嵌套模型的窗体_Ruby On Rails_Devise_Simple Form_Nested Resources - Fatal编程技术网

Ruby on rails RubyonRails。不同视图中嵌套模型的窗体

Ruby on rails RubyonRails。不同视图中嵌套模型的窗体,ruby-on-rails,devise,simple-form,nested-resources,Ruby On Rails,Devise,Simple Form,Nested Resources,我已经和这件事斗争了一段时间,但我想不出来。我有一个使用Desive的用户模型。用户可以上传歌曲、添加youtube视频等 我正试图让用户从designe编辑注册视图中添加/删除歌曲和视频 视频上传很好,但由于歌曲是属于用户的播放列表的嵌套资源,我想我弄糊涂了 音乐以相同的形式上传到相应的页面上,但不是从designe注册编辑视图上传 路线: devise_for :users, controllers: { registrations: "users/registrations", ses

我已经和这件事斗争了一段时间,但我想不出来。我有一个使用Desive的用户模型。用户可以上传歌曲、添加youtube视频等

我正试图让用户从designe
编辑注册
视图中添加/删除歌曲和视频

视频上传很好,但由于歌曲是属于用户的播放列表的嵌套资源,我想我弄糊涂了

音乐以相同的形式上传到相应的页面上,但不是从designe
注册编辑视图上传

路线:

  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
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
设计编辑注册中的表格:

<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>
Playlist.rb

class Playlist < ActiveRecord::Base
  belongs_to :user
  has_many :songs, :dependent => :destroy
  accepts_nested_attributes_for :songs
end
class Playlist:destroy
接受歌曲的\u嵌套\u属性\u
结束
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
classsong['audio/mp3','audio/mpeg']
结束

除非您正在传递
歌曲
/
播放列表
,否则您不应该使用
注册#编辑
。我将在下面详细介绍实现您所需的两种方法:


嵌套属性

#app/models/user.rb
class User < ActiveRecord::Base
  has_many :videos

  has_many :playlists
  has_many :songs, through: :playlists

  accepts_nested_attributes_for :videos
end

#app/models/playlist.rb
class PlayList < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :songs
end

#app/models/song.rb
class Song < ActiveRecord::Base
  has_and_belongs_to_many :playlists
end
这将允许您使用:

#app/views/users/registrations/edit.html.erb
<%= form_for @user do |f| %>
  <%= f.fields_for :videos do |v| %>
    <%= v.text_field :youtubeurl %>
  <% end %>
  <%= f.fields_for :playlists do |p| %>
    <%= p.collection_select :song_ids, Song.all, :id, :name %>
    <%= p.fields_for :song do |s| %>
      <%= f.text_field :title %>
    <% end %>
  <% end %> 
  <%= f.submit %>
<% end %>

以上内容需要复制
播放列表
歌曲的
视频控制器
谢谢您的深入回答。我尝试过各种形式,也遇到过许多错误。目前,我已经摆脱了播放列表和歌曲嵌套资源。用户现在有视频、视频和歌曲。我可以从注册编辑页面成功创建新视频,因为表单会触发视频控制器。当我尝试提交上传歌曲表单时,歌曲控制器没有被解雇,只是注册控制器(我不明白为什么)。对于我的设置,我不认为我真的需要嵌套资源,只需要在另一个控制器中使用表单的能力。最后我放弃了。我无法用这种方式创作歌曲。视频很好,我找不到两个模型之间的任何差异,所以我不明白为什么它不起作用。对于这些歌曲,我刚刚在registrations edit视图中呈现了一个部分表单,它可以根据需要工作。否。你永远不能停止。你甚至都没试过。你现在在吗?让我们跳到聊天,并得到它不要让我做一个聊天室,我会张贴在这里的链接
#app/views/users/registrations/edit.html.erb
<%= form_for @user do |f| %>
  <%= f.fields_for :videos do |v| %>
    <%= v.text_field :youtubeurl %>
  <% end %>
  <%= f.fields_for :playlists do |p| %>
    <%= p.collection_select :song_ids, Song.all, :id, :name %>
    <%= p.fields_for :song do |s| %>
      <%= f.text_field :title %>
    <% end %>
  <% end %> 
  <%= f.submit %>
<% end %>
# config/routes.rb
authenticated :user do #-> user has to be logged in
  resources :videos, :playlists, :songs #-> url.com/videos/new
end

# app/controllers/videos_controller.rb
class VideosController < ApplicationController
  def new
    @video = current_user.videos.new
  end

  def create
    @video = current_user.videos.new video_params
    @video.save
  end

  private

  def video_params
    params.require(:video).permit(:youtubeurl)
  end
end

# app/views/videos/new.html.erb
<%= form_for @video do |f| %>
  <%= f.text_field :youtubeurl %>
  <%= f.submit %>
<% end %>