Scenario: I''m creating an image file upload service for my web site. As well as saving the actual file I also need to create a database record for the file. I would like to name the file after the record id, but I also need to save some attributes of the image (width/height/mime_type etc) which I can''t discover until after the file is created. The Problem: 1) The id is not available until after the record is saved so I can''t create the file until after the record has been created 2) if I try to update the record in the after_create hook it creates an extra record in the database instead of updating the existing one. Is this a bug? Any advice to resolve this problem would be most welcome. It could be done in the controller of course, but I feel it belongs in the model. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
On Tue, Sep 23, 2008 at 5:31 AM, Noel Walters < rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> > Scenario: > > I''m creating an image file upload service for my web site. > > As well as saving the actual file I also need to create a database > record for the file. > > I would like to name the file after the record id, but I also need to > save some attributes of the image (width/height/mime_type etc) which I > can''t discover until after the file is created. >> The Problem: > 1) The id is not available until after the record is saved so I can''t > create the file until after the record has been created >Yes, that''s correct that the id of the record isn''t known until it is saved.> > 2) if I try to update the record in the after_create hook it creates an > extra record in the database instead of updating the existing one. >I think that you would want to use the after_save hook instead of the after_create if you''re wanting to perform an update of the file''s meta- data. However, you may also want to take a look at the before_save callback as well in the api.rubyonrails.com.> > Is this a bug? >Where''s the code snippet? Are you trying to store the file into the database or simply create metadata for the file that''s stored into the database?> > Any advice to resolve this problem would be most welcome. > > It could be done in the controller of course, but I feel it belongs in > the model.Lastly, most of the database reading/writing can be isolated into the class model and this is the recommended pattern to follow when it''s possible. However, you should understand the controller''s role in the MVC design pattern. It''s job is to act as the mediator between the model and the view. Thus, the controller may make decisions to create, read, update, and delete (CRUD) a model instance or models depending on what action is invoked on the controller. Good luck, -Conrad --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
Thanks for the reply, I''ll experiment with the things you sugested. I''m just trying to save meta data in the database, The file I want to save on the disk. I''m using the id as a filename (e.g. mydomain/contents/123.jpg) so that my restful URL will work without invoking the controller. Here is my code snippet (forgot to post first time) require ''RMagick'' include Magick class Content < ActiveRecord::Base def uploaded_file=( file_upload_param ) self.filename = file_upload_param.original_filename @file_upload_param = file_upload_param end def after_create if ( @file_upload_param ) # save the uploaded file File.open( self.location, "w+" ) do |f| f.write( @file_upload_param.read ) end # load the file into an RMagick image list il = ImageList.new( self.location ) self.width = il[0].columns self.height = il[0].rows self.save # Error: this creates another record in the DB! #create the thumbnail il[0].crop_resized!( 60, 45 ).write( "#{self.thumb_location}" ) end end def self.location( id, extname ) "#{RAILS_ROOT}/contents/#{id}.#{extname}" end def location Content.location( self.id, self.extname ) end def extname File.extname(self.filename)[1..-1].downcase end end #-------------------- I''ll try changing the after_create to after_save and see what happens. Conrad Taylor wrote:> On Tue, Sep 23, 2008 at 5:31 AM, Noel Walters < > rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote: > >> can''t discover until after the file is created. >> > >> The Problem: >> 1) The id is not available until after the record is saved so I can''t >> create the file until after the record has been created >> > > Yes, that''s correct that the id of the record isn''t known until it is > saved. > > >> >> 2) if I try to update the record in the after_create hook it creates an >> extra record in the database instead of updating the existing one. >> > > I think that you would want to use the after_save hook instead of the > after_create if you''re wanting to perform an update of the file''s meta- > data. However, you may also want to take a look at the before_save > callback as well in the api.rubyonrails.com. > > >> >> Is this a bug? >> > > Where''s the code snippet? Are you trying to store the file into the > database or simply create metadata for the file that''s stored into the > database? > > >> >> Any advice to resolve this problem would be most welcome. >> >> It could be done in the controller of course, but I feel it belongs in >> the model. > > > Lastly, most of the database reading/writing can be isolated into the > class model and this is the recommended pattern to follow when it''s > possible. However, you should understand the controller''s role in the > MVC design pattern. It''s job is to act as the mediator between the > model and the view. Thus, the controller may make decisions to > create, read, update, and delete (CRUD) a model instance or models > depending on what action is invoked on the controller. > > Good luck, > > -Conrad-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
OK - my bad. All works OK, can''t explain how I made this mistake but it seems it was working all along. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---