2016-07-17 12 views
0

Ich möchte Songs hinzufügen, die bereits von Künstlern in eine Benutzerbibliothek hochgeladen wurden (ich habe meine App bereits eingerichtet, damit Künstler Songs hochladen können). Außerdem habe ich meinen Code so eingerichtet, dass eine leere Benutzerbibliothek erstellt wird, nachdem sich ein Benutzer angemeldet hat (mit dem after_create Active Record Callback).So fügen Sie einer Musikbibliothek vorhandene Titel hinzu Rails 4

Um klarer zu sein, möchte ich für den Benutzer in der Lage sein, Lieder, die sie innerhalb der Website sehen, zu ihrer Bibliothek hinzuzufügen.

Allerdings entkommt dies mir. Ich bin mit CRUD vertraut und habe eine Idee, wie ich eine Bibliothek erstellen und vorhandene Songs hinzufügen würde, aber ich bin mir nicht sicher, wie ich einen Song zu einer Benutzerbibliothek hinzufügen könnte, indem ich auf einen Button/Link "Add Song To" klicke Bibliothek ", die sich neben einem Lied befinden würde, und das Hinzufügen zur vorhandenen leeren Bibliothek des Benutzers.

Mein bestehender Code ist unten.

User.rb:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    belongs_to :meta, polymorphic: true 

    before_create :create_empty_profile 

    after_create :create_empty_library #may not be the best way to do it ¯\_(ツ)_/¯ 

    acts_as_messageable 

    has_many :playlists 

    has_many :user_friendships, dependent: :destroy 
    has_many :friends, -> { where(user_friendships: { state: 'accepted'}) }, through: :user_friendships 
    has_many :pending_user_friendships, -> { where ({ state: 'pending' }) }, class_name: 'UserFriendship', foreign_key: :user_id 
    has_many :pending_friends, through: :pending_user_friendships, source: :friend 

    has_many :chat_rooms, dependent: :destroy 
    has_many :chat_messages, dependent: :destroy 

    has_many :votes, dependent: :destroy 

    mount_uploader :profile_pic, ProfilePicUploader 

    def mailboxer_name 
     self.name 
    end 

    def mailboxer_email(object) 
     self.email 
    end 

    def admin? 
    role == 'admin' 
    end 

    def moderator? 
    role == 'moderator' 
    end 

    def create_empty_profile 
    if is_artist? 
     profile = ArtistProfile.new 
    else 
     profile = UserProfile.new 
    end 
    profile.save(validate: false) 
    self.meta_id = profile.id 
    self.meta_type = profile.class.name 
    end 

    def create_empty_library 
    library = Library.new 
    library.user_id = self.id 
    library.save(validate: false) 
    end 

end 

Library.rb:

class Library < ActiveRecord::Base 
    belongs_to :user 

    has_many :library_songs 
    has_many :songs, through: :library_songs 

    has_many :library_albums 
    has_many :albums, through: :library_albums 
end 

library_song.rb

class LibrarySong < ActiveRecord::Base 
    belongs_to :library 
    belongs_to :song 
end 

library_album.rb

class LibraryAlbum < ActiveRecord::Base 
    belongs_to :library 
    belongs_to :album 
end 

libraries_controller.rb

class LibrariesController < ApplicationController 
    def index 
    @libraries = Library.all 
    end 

    def show 
    @library = Library.find(params[:id]) 
    end 
end 

war ich in der Lage, Wiedergabelisten zu erstellen und unter Songs, um sie mit dem Formular/Controller hinzuzufügen.

Wiedergabelisten/new.html.erb:

<h1>New Playlist</h1> 

<%= form_for(@playlist) do |f| %> 
    <%= f.text_field :name %> 

    <% Song.all.each do |song| -%> 
    <div> 
     <%= check_box_tag :song_ids, song.id, false, :name => 'playlist[song_ids][]', id: "song-#{song.id}" %> 
     <%= song.name %> 
    </div> 
    <% end %> 

    <%= f.submit %> 
<% end %> 

playlists_controller.rb:

class PlaylistsController < ApplicationController 
    def index 
    @playlists = Playlist.all 
    end 

    def show 
    @playlist = Playlist.find(params[:id]) 
    end 

    def new 
    @playlist = Playlist.new 
    end 

    def create 
    @playlist = Playlist.create(playlist_params) 
    redirect_to @playlist 
    end 

    private 

    def playlist_params 
    params.require(:playlist).permit(:name, song_ids: []) 
    end 
end 

Allerdings ist das Hauptproblem, dass oben in der Form wird die Playlist mit den erzeugten entlang wobei bestehende Lieder. In diesem Fall müsste ich vorhandene Songs zu einer bestehenden Bibliothek hinzufügen, die leer ist.

Irgendwelche Ideen, Leute? Dies wäre sehr hilfreich. Ich würde gerne den benötigten Code hochladen.

+0

Ich verstehe nicht ganz, was Sie meinen 'Die Playlist wird zusammen mit den vorhandenen Songs erstellt. In diesem Fall müsste ich vorhandene Titel zu einer vorhandenen leeren Bibliothek hinzufügen. – oreoluwa

+0

Im Formular "Wiedergabelisten/new.html.erb" erstelle ich eine Wiedergabeliste und wähle die Titel aus, die gleichzeitig zur Wiedergabeliste hinzugefügt werden sollen . Ich müsste in der Lage sein, einen vorhandenen Song zu einer Bibliothek hinzuzufügen, die bereits zuvor erstellt wurde. (Wenn sich ein Benutzer anmeldet, wird eine Bibliothek erstellt, die jedoch leer ist). Sobald der Benutzer die Site durchsucht hat, sollte er in der Lage sein, Songs, die er auf der Site sieht, derselben Bibliothek hinzuzufügen. – user3700231

+0

vertauschen Sie die Verwendung von 'Playlisten' und' Bibliothek'? – oreoluwa

Antwort

0

Es sieht für mich so aus, als ob Sie has_many: libraries nicht in Ihrem Benutzermodell festgelegt haben. Nach Ihrem Bibliotheksmodell zu urteilen, denke ich, dass Sie das beabsichtigt hatten. Sie sollten wirklich nur die 'neuen' Modelle erstellen, bevor Sie das Benutzermodell speichern. Sie könnten etwas ähnliches verwenden und alles in einer Aktion tun.

class User < ActiveRecord::Base 
    def self.build_full_user(params, songs) 
    # Assign all normal attributes here 
    new_user = User.new 
    new_user.name = params[:name] 

    # If you want to assign new songs, just make a new Library model and associate them. 
    new_library = Library.new 

    # Build the song models if you haven't found/created or passed them in already. 
    new_songs = Songs.build_songs_from_list(songs) 
    new_library.songs << new_songs 

    new_user.libraries << new_library 

    # You can do the save check here or up one level if you'd like. 
    return new_user 
    end 
end 
Verwandte Themen