ruby on rails - AbstractController::DoubleRenderError Error and using redirect_to -


i have update method using save , delete methods having own render calls. below code:

update method:

def update_book   self.delete_book   params[:name] = params[:newname]   self.save_book end 

delete method:

def delete_book  #  rescue bookdoesnotexist => exception     render status: 404     return  end  head 200 end 

save method:

def save_book  #  rescue bookdoesnotexist => exception     render status: 404     return  end  rescue bookalreadyexist => exception     render status: 409     return  end  head 200 end 

when run input system throws "abstractcontroller::doublerendererror" error along message "render and/or redirect called multiple times in action. please note may call render or redirect, , @ once per action. note neither redirect nor render terminate execution of action, if want exit action after redirecting, need "redirect_to(...) , return"

i understand because throwing exception in both delete , save method input passing. how handle scenario?

doing research learnt need use redirect. understand when delete method throws exception/renders should return , should not call save method.

here tried redirect_to:

update method:

def update_book   redirect_to action: self.delete_book , return if status=404 end   params[:name] = params[:newname]   self.save_book end 

am doing right or there other best way handle redirect?

when delete_book or save_book methods receive exception render , return, correct.

but return give execution caller method, update_book. caller method have no idea of exception occurred , therefore job , render has render.

to fix, delete_book or save_book methods need return success status caller, this:

def delete_book   # ...    rescue bookdoesnotexist => exception     render status: 404     return false   end    head 200   true end 

then caller method shall check status:

def update_book   return unless self.delete_book   params[:name] = params[:newname]   return unless self.save_book end 

an alternative keep code clear heavy exception testing use controller'srescue_from.

in applicationcontroller:

class applicationcontroller < actioncontroller::base   rescue_from bookdoesnotexist, with: :redirect_book_not_existing    private     def redirect_book_not_existing     render status: 404   end end 

from on, time controllers receive bookdoesnotexist exception, execution stop , render status: 404 line executed. off course must not rescue exceptions in other method, this:

def delete_book  #   head 200 end 

your code cleaner


Comments

Popular posts from this blog

java - WrongTypeOfReturnValue exception thrown when unit testing using mockito -

php - Magento - Deleted Base url key -

android - How to disable Button if EditText is empty ? -