2014-09-17 1 views
-1

Я создаю сайт для звукозаписывающей компании, с которой я начинаю.Как смоделировать плейлист в Rails

Сейчас у меня есть модель рабочего художника (пользователя) с проверкой. Теперь мне нужно создать способ для художников создать плейлист со своими песнями. Мне также нужна эта музыка для загрузки для всех.

Это мое мышление:

Создание модели альбома и модель песни.

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

class Song < ActiveRecord::Base 
    belongs_to :album 
end 

Художник создаст альбом с использованием формы альбома. Затем в отдельной форме они создадут Песню, которая будет принадлежать определенному альбому. Они будут добавлять каждую песню в альбом отдельно, поэтому, если у них есть 10 песен в одном альбоме, они будут заполнять форму песни 10 раз.

На странице «Исполнитель» я могу позвонить в альбом исполнителя, чтобы отобразить список песен, принадлежащих этому альбому. Затем эти песни будут воспроизводиться с помощью какого-либо игрока. Затем, когда пользователь без входа в систему нажимает кнопку загрузки, они отображаются на странице загрузки, где они могут загружать ZIP-файл альбома с красиво упакованными композициями.

Я хочу, чтобы это было очень похоже на то, как это делает Bandcamp.

Как я могу это сделать? или, по крайней мере, начать?

+4

всего за один шаг за раз. У вас хорошая отправная точка и хороший логический путь. Без сомнения, вы столкнетесь с дорожными блоками, но вам нужно сделать шаги 1-10, прежде чем мы сможем помочь вам с шагом 28. – Anthony

+0

Богатый отчет хорошо продумал и хороший ответ, но я хотел предложить одно предложение моделирования: если вы думаете, что в любой точке дороги песня может принадлежать более чем одному альбому, вы можете рассмотреть возможность использования отношений has_and_belongs_to_many в модели песни (http://guides.rubyonrails.org/association_basics.html#the-has-and -belongs-ко-многим-ассоциации). Используя свойство own_to, и нет ничего плохого в этом, означает, что если песня заканчивается альбомом «лучших хитов» и его оригинальным альбомом, вы получаете обдуманные данные. Возможно, это не проблема для вас, но я подумал, что я это заметлю. –

ответ

2

Вы, вероятно, хотите сделать что-то вроде этого:

-

Админ

Во-первых, вам понадобится площадь администратора

Это будет где ваш «художник» может загружать свои песни/альбомы, что позволяет вам создать аутентифицированную область для этого человека. Для того, чтобы сделать это на самом деле довольно просто:

#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 

Вы должны проверить подлинность с подобными Devise, применяя его к artist модели , Несмотря на то, что я не буду вдаваться в подробности о том, что вы будете лучше всего с помощью this Railscast:

enter image description here

Очень хороший ресурс по созданию an amazing admin area in Rails can be found here

-

Уплотненный Атрибуты

Вы можете заметить использование accepts_nested_attributes в приведенных выше моделях.

Этот метод дает вам возможность передавать данные ассоциативной формы через модели, что позволяет вам захватывать «дочерние» данные в своей родительской форме.

Не вдаваясь в подробности (в частности, о том, как добавить новые «связанные значения» на лету), вот как вы должны отображать часть песни в форме альбома (если вы создаете песню):

#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 %> 

-

Рекомендация

передний конец "пользователь загружает" часть приложения будет проще всего реализовать.

Вам в основном нужно сделать контроллер для управления загрузкой, а затем убедитесь, что вы имеете капельницу, чтобы получить это работает правильно:

#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, как ваш пользователь/данные будут перемещаться по приложению. Это должно дать вам пошаговый процесс подхода к проблеме, с которой вы сталкиваетесь, тем самым предоставив вам более надежные вопросы/ответы