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"}
有帮助吗?

解决方案

Try this since those are not in the song class.

params[:song].delete("@content_type")
params[:song].delete("@tempfile")
params[:song].delete("@headers")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top