Hi all. A simple app. Albums have songs. Songs have artists. Models
look like:
class Album < ActiveRecord::Base
has_many :albumappearances
has_many :songs, :through => :albumappearances
validates_length_of :description, :minimum => 4
end
class Albumappearance < ActiveRecord::Base
belongs_to :album
belongs_to :song
end
class Song < ActiveRecord::Base
has_many :albumappearances
has_many :albums, :through => :albumappearances
belongs_to :artist
validates_length_of :name, :minimum => 4
end
class Artist < ActiveRecord::Base
has_many :songs
validates_length_of :name, :minimum => 6
end
# --------------
At album create or update, a user can enter a totally new artist/song
combination. If the artist or song don''t exist, they need to get
created.
So, for example, in my controller, i know I can have something like:
def update
# figure out which album we''re talking about.
@album = Album.find(params[:id])
# set the album description the user entered
@album.description = params[:album][:description]
# we''ll need an artist.id later to associate with the song.
# so start with artist.
@artist = Artist.find(params[:artist][:name]) rescue nil
# if no artist was found, we need to create one.
if @artist == nil
@artist = Artist.new(:name => params[:artist][:name])
# try to save the artist. errors will be captured.
@artist.save
end
@song = Song.find(params[:song][:name]) rescue nil
# if we couldn''t find a song, we need to create one.
if @song == nil
@song = Song.new(:name => params[:song][:name])
# see if there are any validation errors with the song
@song.valid?
# if there isn''t an artist and there are errors associated with
the artist...
if @artist.errors && @artist.id = nil
# don''t try to save the song since it won''t have an ID
to use
for artist
# but do try to validate the song so we can tell the user about
the problem
@song.valid?
else
# try to save the song
@artist.songs << @song
end
end
# now, work on the album.
if @song.errors || @artist.errors
# if there were errorsdon''t try to save the album, but validate to
show the user errors
@album.valid?
render :action => ''edit''
# exit
else
# otherwise save the album.
if @album.save
flash[:notice] = ''album was successfully updated.''
redirect_to :action => ''show'', :id => @album
else
render :action => ''edit''
end
end
end
# -----------------
Now, this seems to work, but it seems awfully verbose and un rails-
like. Should some of this get moved to the models? Am I missing
something obvious?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---