How would I stop the last user being deleted.
The following code doesn’t work.
before_destroy :dont_destroy_last_user
Don’t delete user if it the last one
def dont_destroy_last_User
raise “Can’t destroy last user” if User.length < 1
end
How would I stop the last user being deleted.
The following code doesn’t work.
before_destroy :dont_destroy_last_user
def dont_destroy_last_User
raise “Can’t destroy last user” if User.length < 1
end
On 18-feb-2006, at 18:30, Alexander wrote:
How would I stop the last user being deleted.
The following code doesn’t work.
before_destroy :check_if_last_user
private
def check_if_last_user
raise “Last user can’t be deleted” if self.class.count == 1
end
Alexander wrote:
How would I stop the last user being deleted.
The following code doesn’t work.before_destroy :dont_destroy_last_user
Don’t delete user if it the last one
def dont_destroy_last_User
raise “Can’t destroy last user” if User.length < 1
end
Change to:Don’t delete user if it the last one
def dont_destroy_last_User
raise “Can’t destroy last user” if User.count == 1
end
Untested,but should work
joey__
Julian ‘Julik’ Tarkhanov wrote:
On 18-feb-2006, at 18:30, Alexander wrote:
How would I stop the last user being deleted.
The following code doesn’t work.before_destroy :check_if_last_user
private
def check_if_last_user
raise “Last user can’t be deleted” if self.class.count == 1
end
Thanks
Also ‘raise’ creates quite a ugly error message. Is there any way of
redirecting and using flash instead?
Alex
On 18-feb-2006, at 19:06, Alexander wrote:
raise "Last user can't be deleted" if self.class.count == 1
end
Thanks
Also ‘raise’ creates quite a ugly error message. Is there any way of
redirecting and using flash instead?
I think the neat way would be with an exception catcher
in the model:
class LastUserCantBeDeleted < RuntimeError; end;
… raise LastUserCantBeDeleted if self.class.count == 1
in the controller
begin
@user.destroy!
rescue LastUserCantBeDeleted
flash[:error] = "This is the last one’
redirect_to :referer # or something like that
end
A less neat way would be to return false from the method and thus
stop the callback chain, and then
unless @user.destroy!
flash[:error] = “This is the last one”
end
Julian ‘Julik’ Tarkhanov wrote:
flash[:error] = "This is the last one’
end
This will not work if you have two independent FCGI/SCGI processes
trying
to delete the last user at the same time. Might sound bit extreme, but
its
quite possible for example if the user clicks rapidly the submit button
twice.
You’ll need to wrap the deletion and the counting of users in a
transaction. The first beta release of AWDWR had similar code for
preventing the deletion of the last administrator. Revised version was
simpler not allowing to delete ‘Dave’ user. That’s another alternative.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs