2016-07-04 31 views
0

Was ich suche die „album_id“ -Attribut meine Song-Instanz gleich die ID des Albums derzeit laufende gesetzt zu tun.gibt es die ID einer Ressource in einer verschachtelten URL Schienen 4

Zum Beispiel:

http://localhost:3000/artist_profiles/1/albums/2

In der obigen URL, würde Ich mag die "album_id", um den Songs I bis 2.

Meine songs_controller gleich erschaffe:

class Albums::SongsController < ApplicationController 

    before_filter :set_user_friendships 

    def new 
    end 

    def create 
    # Make an object in your bucket for your song 
    obj = S3_BUCKET.objects[params[:file].original_filename] 

    # Upload the file 
    obj.write(
     file: params[:file], 
     acl: :public_read 
    ) 

    # Create an object for the song 
    @song = Song.new(
     url: obj.public_url, 
     name: obj.key 
     ) 

    @song.album_id = Album.find(params[:id]) 

    # Save the upload 
    if @song.save 
     redirect_to artist_profile_albums_path(current_user.id), success: 'File successfully uploaded' 
    else 
     flash.now[:notice] = 'There was an error' 
     render :new 
    end 
    end 

    def index 
    @user_friendships = current_user.user_friendships.all 
    @songs = Song.all 
    end 

    def song_params 
    params.require(:song).permit(:id, :url, :name, :song_title, :album_id) 
    end 

    def set_user_friendships 
    @user_friendships = current_user.user_friendships.all #this is here because of partial UGHHH 
    end 

end 

insbesondere die folgende Zeile ein:

@song.album_id = Album.find(params[:id]) 

Allerdings, wenn ich diesen Code versuche ich die folgende Fehlermeldung erhalten:

Couldn't find Album with 'id'= 

Wenn ich versuche:

@song.album_id = Album.find(2).id 

oder:

@song.album_id = 2 

ich 0 Fehler.

Die Route ich suche auf, nachdem die Harke Routen Befehl ausgeführt ist:

/artist_profiles/:artist_profile_id/albums/:id(.:format) 

Wie würde ich mich über die ID des richtigen Album bekommen?

Jede Hilfe wird geschätzt!

UPDATE:

Mein Protokoll bei dem Versuch, den Song zu laden:

Started POST "/songs" for ::1 at 2016-07-04 07:34:32 -0400 
Processing by Albums::SongsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"/pZp493WqiDgkJC72ueK5Wr4eVqdVvWzY43c/ru/OpSt3J9gECwC7nIhszLgyef218sRWsAr9xSZOnH751MUoA==", "file"=>#<ActionDispatch::Http::UploadedFile:0x007ff871c261b0 @tempfile=#<Tempfile:/var/folders/xb/38dybzwn51g3fg4vb7kdgg5m0000gn/T/RackMultipart20160704-11159-5aarh7.mp3>, @original_filename="03 Exit Wounds (Original Mix).mp3", @content_type="audio/mp3", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"03 Exit Wounds (Original Mix).mp3\"\r\nContent-Type: audio/mp3\r\n">, "commit"=>"Upload song"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
[AWS S3 200 16.701785 0 retries] put_object(:acl=>:public_read,:bucket_name=>"atmosphere-development",:content_length=>13561000,:data=>#<ActionDispatch::Http::UploadedFile:0x007ff871c261b0 @tempfile=#<Tempfile:/var/folders/xb/38dybzwn51g3fg4vb7kdgg5m0000gn/T/RackMultipart20160704-11159-5aarh7.mp3>, @original_filename="03 Exit Wounds (Original Mix).mp3", @content_type="audio/mp3", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"03 Exit Wounds (Original Mix).mp3\"\r\nContent-Type: audio/mp3\r\n">,:key=>"03 Exit Wounds (Original Mix).mp3") 

    Album Load (0.1ms) SELECT "albums".* FROM "albums" WHERE "albums"."id" = ? LIMIT 1 [["id", nil]] 
Completed 404 Not Found in 16748ms (ActiveRecord: 0.9ms) 

ActiveRecord::RecordNotFound (Couldn't find Album with 'id'=): 
    app/controllers/albums/songs_controller.rb:24:in `create' 


    Rendered /Users/sethjones/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_source.erb (5.1ms) 
    Rendered /Users/sethjones/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.0ms) 
    Rendered /Users/sethjones/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (3.0ms) 
    Rendered /Users/sethjones/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (60.4ms) 
Cannot render console with content type multipart/form-dataAllowed content types: [#<Mime::Type:0x007ff8731e25a8 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">, #<Mime::Type:0x007ff8731e22d8 @synonyms=[], @symbol=:text, @string="text/plain">, #<Mime::Type:0x007ff8731dae20 @synonyms=[], @symbol=:url_encoded_form, @string="application/x-www-form-urlencoded">] 
+0

können Sie Route und Protokoll teilen? – chaitanya

+0

Eigentlich müssen Sie überprüfen, welche ID Sie in params [: id] erhalten, ist es Album-ID oder Song-ID? – chaitanya

+0

Wie würde ich das überprüfen? Rails sagt mir, dass die ID nicht existiert. – user3700231

Antwort

2

Nach den Diskussionen im Chat:

params[:album_id].to_i worked. 

Offenbar Schienen nicht die ID zu konvertieren hat in Integer als er versuchte, es wie folgt zu vergeben:

@song.album_id = params[:album_id] 

-

Wie auch immer die Art, wie ich es tue, ist durch das verschachtelte Modell über sein Muttermodell.

Anstatt also schreibe diesen Code:

@song = Song.new(
    url: obj.public_url, 
    name: obj.key 
    ) 

@song.album_id = Album.find(params[:id]) 

Sie schreiben:

album = Album.find(params[:id]) 
@song = album.songs.build(url: obj.public_url, name: obj.key) 

und es sollte die album_id auf die richtige eins gesetzt. (Das ist die ID album, die wir von der Abfrage erhalten).

Aber auf diese Weise haben Sie eine zusätzliche Abfrage, um das Album zu finden, und mit der .to_i Methode nicht, also behalte das im Hinterkopf.

0

Problem dank gelöst @chaitanya und @Ziv Galili

Changed die Zeile:

@song.album_id = params[:album_id].to_i 

Und hinzugefügt album_id zur Hochladen.