Rails - Update_attributes was working now getting undefined method error
-
21-06-2021 - |
Pregunta
This was working, but now i'm getting the below error when calling update_attributes :
NoMethodError in SongsController#update
undefined method `name' for nil:NilClass
Rails.root: C:/Sites/music3
Application Trace | Framework Trace | Full Trace
app/controllers/songs_controller.rb:164:in `update'
What is confusing me is that my @song object doesn't have "name" in it. (see schema below), but the artist does. Songs and Artists are associated through a many to many relationship. Seems like update_attributes is trying to update the artist object as well? Didn't think it was supposed to do this. Really not sure whats up here any help would be greatly appreciated.
Thanks,
Song Controller
def update
@artist = Artist.find(params[:artist_id])
authorize! :update, @artist
@song = Song.find(params[:form_song_id])
@song.artists << @artist
@s3_test = params[:s3_name]
@song.update_attributes(params[:song]) #causing the error
end
Schema
create_table "artists", :force => true do |t|
t.string "name"
t.string "city"
t.string "province"
t.string "country"
t.text "influence"
t.text "bio"
t.text "contact_info"
t.date "date_founded"
t.date "created_date"
t.datetime "created_at"
t.datetime "updated_at"
t.string "url_slug"
t.string "pay_pal"
t.string "image"
end
create_table "songs", :force => true do |t|
t.string "song_name"
t.string "song_artist"
t.string "song_contribute_artist"
t.string "song_written"
t.string "song_licence_type"
t.string "song_url_slug"
t.date "song_licence_date"
t.integer "song_plays"
t.text "lyrics"
t.datetime "created_at"
t.datetime "updated_at"
t.string "s3_name"
t.string "download_link"
t.string "torrent_link"
t.string "s3_id"
t.integer "s_a_id"
end
Example Params.
{"utf8"=>"✓",
"_method"=>"put",
"song"=>{"s3_name"=>#<ActionDispatch::Http::UploadedFile:0x260e908 @original_filename="done good (final final).mp3",
@content_type="audio/mp3",
@headers="Content-Disposition: form-data; name=\"song[s3_name]\"; filename=\"done good (final final).mp3\"\r\nContent-Type: audio/mp3\r\n",
@tempfile=#<File:C:/Users/Ted/AppData/Local/Temp/RackMultipart20120716-1600-ohtooj>>,
"song_name"=>"Done Good",
"song_artist"=>"Grimes",
"song_contribute_artist"=>"",
"song_written"=>"Ted Kennedy",
"song_licence_type"=>"copywrite",
"song_licence_date(1i)"=>"2012",
"song_licence_date(2i)"=>"7",
"song_licence_date(3i)"=>"17",
"song_plays"=>"",
"song_url_slug"=>"",
"lyrics"=>"None"},
"commit"=>"Upload",
"artist_id"=>"1",
"form_song_id"=>"5",
"id"=>"create"}
Solución
Try this since those are not in the song class.
params[:song].delete("@content_type")
params[:song].delete("@tempfile")
params[:song].delete("@headers")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow