That is the intention of the 'bang' methods in DataMapper for persistence, yes.
It is one of the divergence points from ActiveRecord. The danger (see http://dablog.rubypal.com/2007/8/15/bang-methods-or-danger-will-rubyist) isn't in the exception that might be raised. It is instead that no hooks are run nor are any validations (risking an incorrect record, or child records not being created). Regards Jon On 7 April 2011 04:15, kristian <meier.krist...@gmail.com> wrote: > I was writing without testing it out myself. save! does not do > validation and the hope was that it does not trigger "atfer save" > again otherwise you end up in an endless loop. > > this time I tested it and works for me > https://gist.github.com/906962 > > - Kristian > > On Apr 7, 1:56 am, DAZ <daz4...@gmail.com> wrote: >> Hi Kristian, >> >> The code I have shown is not the exact code I am using - it has to be >> saved to the database. I just gave this code so it was easier to >> follow. >> >> > without looking into the datamapper code, but the create method is on >> > the model class and NOT on instance. my guts feeling is to do >> > something like >> >> > after :save do >> > self.url ='/mysite/' << self.id.to_s >> > self.save! >> > end >> >> How come self.save!, what's the difference with this and self.save? >> >> cheers, >> >> DAZ >> >> On Apr 6, 3:00 pm, kristian <meier.krist...@gmail.com> wrote: >> >> > even in case I am on the wrong track, but there is no need to have the >> > url in the database, just have a method >> >> > def url >> > "/mysite/#{self.id}" >> > end >> >> > in case you want to be able set the url with something differently >> > after create, you could do something like >> >> > def url >> > u = attribute_get(:url) >> > if u >> > u >> > else >> > "/mysite/#{self.id}" >> > end >> > end >> >> > so basically a database NULL will be your default otherwise return the >> > database value >> >> > without looking into the datamapper code, but the create method is on >> > the model class and NOT on instance. my guts feeling is to do >> > something like >> >> > after :save do >> > self.url ='/mysite/' << self.id.to_s >> > self.save! >> > end >> >> > regards, Kristian >> >> > On Apr 6, 11:02 am, DAZ <daz4...@gmail.com> wrote: >> >> > > Thanks for pointing out my schoolboy error there Jon! >> >> > > This now works: >> > > post '/new' do >> > > @page = Page.create(params[:page]) >> > > @page.url = '/mysite/' << @page.id.to_s >> > > @page.save >> > > ....etc >> >> > > But this feels really ugly - surely this logic should be in the model, >> > > not the controller? In this implementation, the url only gets saved >> > > when the resource is created on the web. >> >> > > Is there a way to do something similar using the after :create hook? I >> > > can't see why this doesn't work, as it should do the same as the code >> > > above: >> >> > > after :create do >> > > self.url ='/mysite/' << self.id.to_s >> > > self.save >> > > end >> >> > > cheers, >> >> > > DAZ >> >> > > On Apr 5, 10:59 pm, Jonathan Stott <jonathan.st...@gmail.com> wrote: >> >> > > > For that to work, you want `...@page.id` not `self.id` >> >> > > > Regards >> > > > Jon >> >> > > > On 5 April 2011 22:55, DAZ <daz4...@gmail.com> wrote: >> >> > > > > Since I couldn't get the after :create hook to work, I tried putting >> > > > > this ugly code in a handler: >> >> > > > > post '/new' do >> > > > > @page = Page.create(params[:page]) >> > > > > @page.url = '/mysite/' << self.id.to_s >> > > > > @page.save >> >> > > > > This 'works', but strangely the id seems to be an object id, rather >> > > > > than the id property from the database. What's going on here?? >> >> > > > > There must be a way of using a resource's id property to set another >> > > > > property ... surely? >> >> > > > > cheers, >> >> > > > > DAZ >> >> > > > > On Apr 5, 5:47 pm, DAZ <daz4...@gmail.com> wrote: >> > > > >> > Is there any 'best practice' way of doing this sort of thing? >> >> > > > >> > For example, do I use an after :create hook and then call >> > > > >> > self.save at >> > > > >> > the end? >> > > > >> > eg >> > > > >> > after :create do >> > > > >> > self.url ='/mysite/' << self.id.to_s >> > > > >> > self.save >> > > > >> > end >> >> > > > >> Well the 'best practice' way is definitely not this way because it >> > > > >> returns false - the resource is created but then is not saved >> > > > >> afterwards and the url property is considered 'dirty' (what does >> > > > >> that >> > > > >> actually mean?? >> >> > > > >> I'm puzzled by this! >> >> > > > >> DAZ >> >> > > > > -- >> > > > > You received this message because you are subscribed to the Google >> > > > > Groups "DataMapper" group. >> > > > > To post to this group, send email to datamapper@googlegroups.com. >> > > > > To unsubscribe from this group, send email to >> > > > > datamapper+unsubscr...@googlegroups.com. >> > > > > For more options, visit this group >> > > > > athttp://groups.google.com/group/datamapper?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "DataMapper" group. > To post to this group, send email to datamapper@googlegroups.com. > To unsubscribe from this group, send email to > datamapper+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/datamapper?hl=en. > > -- You received this message because you are subscribed to the Google Groups "DataMapper" group. To post to this group, send email to datamapper@googlegroups.com. To unsubscribe from this group, send email to datamapper+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/datamapper?hl=en.