这是有效的,但现在我在调用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'
让我困惑的是,我的@song对象中没有"name"(见下面的模式),但艺术家有。歌曲和艺术家是通过多对多的关系联系在一起的。update_attributes似乎也在尝试更新艺术家对象?没想到它应该这么做。真的不知道这里有什么,如果有任何帮助,我们将不胜感激。
谢谢,
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
架构
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
示例参数。
{"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"rnContent-Type: audio/mp3rn",
@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"}
试试这个,因为它们不在歌曲类中。
params[:song].delete("@content_type")
params[:song].delete("@tempfile")
params[:song].delete("@headers")