我正在为我正在创办的唱片公司创建一个网站。
现在我有一个有验证的工作艺术家(用户)模型。我现在需要为艺术家创建一种用他们的歌曲创建播放列表的方式。我还需要这个音乐可供所有人下载。
这是我的想法:
创建专辑模型和歌曲模型。
class Album < ActiveRecord::Base
belongs_to :artist
has_many :songs
end
class Song < ActiveRecord::Base
belongs_to :album
end
艺术家将使用相册表单创建相册。然后在另一个表单上,他们将创建一个属于某个专辑的歌曲。他们会将每首歌曲分别添加到专辑中,因此如果他们在一个专辑中有10首歌曲,他们将填写歌曲表格10次。
在艺术家表演页面上,我可以调用艺术家的专辑来显示属于该专辑的歌曲列表。那些歌曲将通过某种类型的播放器播放。然后,当一个未登录的用户点击下载按钮时,他们会被带到一个下载页面,在那里他们可以下载一个很好地打包的歌曲的专辑的.zip文件。
我希望这与Bandcamp的做法非常相似。
我该怎么做呢?或者至少开始?
答案 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:
创建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来思考您的用户/数据将如何通过应用。这应该为您提供一个逐步处理您面临的问题的过程,从而为您提供更强大的问题/答案