I''ve been working with developing a few rails/mysql applications to replace some rather shoddy access databases that are currently in use here. It''s going well but I ran into one area that I''m curious if there is a way to improve. Basically the database has several instances of Many-to-Many relationships to handle different things. At present each of these has a seperate "add" function that looks like this: ------------ def add_entry @entry = Entry.new(params[:entry]) @entry.item_id = params[:id] if @entry.save flash[:notice] = "Record updated." redirect_to :action => "show", :id => params[:id] else flash[:notice] = "Error: failed to add entry!" redirect_to :action => "show", :id => params[:id] end end end ------------ Each is virtually identical except one is using say an entry object and the next is using a post object. Is there a way to just build a more generic function that would take over this process so I could just pass it and item and it would take care of saving it properly? Is it worth bothering with? The Agile web development book stresses not repeating the same code over and over and I''m up to 3 instances of this same basic function, I''m not sure there is a way to avoid it and it''s not that big of a deal. I did a bit of searching and really couldn''t find something that addressed this. Kevin Kolk -- Posted via http://www.ruby-forum.com/.
Rachel McConnell
2006-Mar-22 19:33 UTC
[Rails] Generic ''save'' function for multiple objects?
Kevin Kolk wrote:> ------------ > def add_entry > @entry = Entry.new(params[:entry]) > @entry.item_id = params[:id] > if @entry.save > flash[:notice] = "Record updated." > redirect_to :action => "show", :id => params[:id] > else > flash[:notice] = "Error: failed to add entry!" > redirect_to :action => "show", :id => params[:id] > end > end > end > ------------ > Each is virtually identical except one is using say an entry object and > the next is using a post object. Is there a way to just build a more > generic function that would take over this process so I could just pass > it and item and it would take care of saving it properly? Is it worth > bothering with?I''ve got a very similar situation where I''ve been just copy/pasting, as you have been, but seeing your question laid out so cleanly makes me think of a possible solution. This ought to be handle-able by passing in the actual class of which a new instance is needed. Everything in Ruby is an object, right? So I am going to try something like this: def add_item( type, symbol ) @item = type.new(params[symbol]) if @item.save // do the things end end and call it like this: add_item( Entry.class, :entry ) and see what happens. I don''t know if things work this way in Ruby and I don''t have time to play with this project again until tomorrow, alas, so I might be completely wrong here. Rachel