如何在Rails中建模播放列表

时间:2014-09-17 20:37:34

标签: ruby-on-rails ruby playlist

我正在为我正在创办的唱片公司创建一个网站。

现在我有一个有验证的工作艺术家(用户)模型。我现在需要为艺术家创建一种用他们的歌曲创建播放列表的方式。我还需要这个音乐可供所有人下载。

这是我的想法:

创建专辑模型和歌曲模型。

class Album < ActiveRecord::Base
  belongs_to :artist
  has_many :songs
end

class Song < ActiveRecord::Base
  belongs_to :album
end

艺术家将使用相册表单创建相册。然后在另一个表单上,他们将创建一个属于某个专辑的歌曲。他们会将每首歌曲分别添加到专辑中,因此如果他们在一个专辑中有10首歌曲,他们将填写歌曲表格10次。

在艺术家表演页面上,我可以调用艺术家的专辑来显示属于该专辑的歌曲列表。那些歌曲将通过某种类型的播放器播放。然后,当一个未登录的用户点击下载按钮时,他们会被带到一个下载页面,在那里他们可以下载一个很好地打包的歌曲的专辑的.zip文件。

我希望这与Bandcamp的做法非常相似。

我该怎么做呢?或者至少开始?

1 个答案:

答案 0 :(得分:2)

你可能想做这样的事情:

-

管理

首先,您需要管理区域

这将是您的&#34;艺术家&#34;可以上传他们的歌曲/专辑,允许您为该人创建一个经过身份验证的区域。要做到这一点实际上非常简单:

#config/routes.rb
namespace :admin do
   root: "albums#index"
   resources :albums, except: :show
end
resources :albums, only: [:index, :show]

#app/controllers/albums_controller.rb
class Admin::AlbumsController < ApplicationController
   before_action :authenticate_user!

   def index
      @albums = Album.all
   end

   def new
      @album = Album.new
      @album.songs.build
   end

   def create
      @album = Album.new album_params
      @album.save
   end

   private

   def album_params
     params.require(:album).permit(:your_album_params, songs_attributes: [:songs, :attributes])
   end
end

这应该使用适当的模型进行备份:

#app/models/artist.rb
class Artist < ActiveRecord::Base
  # devise code here
end

#app/models/album.rb
class Album < ActiveRecord::Base 
   belongs_to :artist

   has_many :songs
   accepts_nested_attributes_for :songs
end

#app/models/song.rb
class Song < ActiveRecord::Base
   belongs_to :album
end

您必须通过将其应用于artist模型,对Devise之类的人进行身份验证。虽然我不会详细了解这一点,但您最好使用this Railscast

enter image description here

创建an amazing admin area in Rails can be found here

的非常好的资源

-

嵌套属性

您可能会注意到上述模型中使用了accepts_nested_attributes

此方法使您能够通过模型传递关联表单数据,从而允许您捕获&#34; child&#34;父表单本身的数据。

没有详细介绍(特别是关于如何动态添加新的&#34;关联的&#34;值),这里有你应该如何呈现&#34;歌曲&#34;你的专辑形式的一部分(如果你正在创作这首歌):

#app/views/admin/albums/new.html.erb
<%= form_for @album do |f| %>
   <%= f.fields_for :songs do |s| %>
      <%= s.text_field :name %>
   <% end %>
   <%= f.submit %>
<% end %>

-

<强>建议

前端&#34;用户下载&#34;应用程序的一部分将是最简单的实现。

您基本上需要制作一个控制器来管理下载,然后确保您设置了流程以使其正常工作:

#app/controllers/albums_controller.rb -> notice no "admin" folder?
class AlbumsController < ApplicationController
   def index
      @albums = Album.all
   end

   def show
      @album = Album.find params[:id]
   end
end

如上所述,您可能最适合根据flow - IE来思考您的用户/数据将如何通过应用。这应该为您提供一个逐步处理您面临的问题的过程,从而为您提供更强大的问题/答案