Moreover, can't we move out explicit save in the controller to model like this:
## model.rb def mark_deleted self.update_attribute(:status, "deleted") end Thanks, Abhinav -- अभिनव http://twitter.com/abhinav On Sun, Sep 6, 2009 at 12:56 PM, Colin Law <clan...@googlemail.com> wrote: > > 2009/9/5 brianp <brian.o.pea...@gmail.com>: > > > > So after what i end up with is a: > > > > // word.rb, definition.rb > > def set_status(status) > > self.status = status > > end > > Arguably set_status is not a good name, as it requires the caller to > know about the status field in the model. Something mark_deleted > might be a better name. > > Colin > > > > > // word_controller.rb > > def destroy > > @word = Word.find(params[:id], :include => :definitions) > > > > begin > > ActiveRecord::Base.transaction do > > @word.set_status("deleted") > > @word.save > > > > @word.definitions.each do |h| > > h.set_status("deleted") > > h.save > > end > > end > > rescue ActiveRecord::RecordInvalid => invalid > > flash[:notice] = 'Word was not deleted' > > render :action => "new" > > end > > > > respond_to do |format| > > format.html { redirect_to(words_url) } > > end > > end > > > > Which seems much more appropriate. > > > > > > On Sep 5, 1:07 pm, brianp <brian.o.pea...@gmail.com> wrote: > >> Your are very right. I shouldn't actually have the controller changing > >> the status at all. I should maybe have the controller call the models > >> change status method when called but that is it. And because the > >> method will now be in the model it wont be in the controller and I > >> wont be breaking dry like I thought of before. > >> > >> I should have thought of that earlier once i realized destroy was > >> doing a little more work then actually destroying. > >> > >> Thanks for the input, I knew I was looking at it from the wrong angle > >> it just felt wrong. > >> > >> On Sep 5, 12:25 pm, pharrington <xenogene...@gmail.com> wrote: > >> > >> > On Sep 5, 3:07 pm, brianp <brian.o.pea...@gmail.com> wrote: > >> > >> > > Hey, > >> > > I was just wondering what the best practice for this situation would > >> > > be. I've got two models(word, definition) both with destroy methods > in > >> > > the controllers that just change the model.status to "deleted". In > the > >> > > words controller I'd like it to call the definition_controller > destroy > >> > > method on definition models. And I'm just blanking on how to do this > >> > > like a regular model method. Would I have to double the destory > method > >> > > in the model? Then I wouldn't be adhering to dry. > >> > >> > > // words_controller.rb > >> > > def destroy > >> > > begin > >> > > ActiveRecord::Base.transaction do > >> > > @word = Word.find(params[:id], :include => :definitions) > >> > > @word.status = 'deleted' > >> > > @word.save > >> > >> > > @word.definitions.each do |h| > >> > > h.destroy // Actually destorys the record instead of just > >> > > setting the status to "deleted" > >> > > end > >> > > end > >> > > rescue ActiveRecord::RecordInvalid => invalid > >> > > flash[:notice] = 'Word was not deleted' > >> > > render :action => "new" > >> > > end > >> > >> > > respond_to do |format| > >> > > format.html { redirect_to(words_url) } > >> > > end > >> > > end > >> > >> > > // definitions_controller.rb > >> > > def destroy > >> > > begin > >> > > ActiveRecord::Base.transaction do > >> > > @definition = Definition.find(params[:id]) > >> > > @definition.status = 'deleted' > >> > > @definition.save > >> > > end > >> > > rescue ActiveRecord::RecordInvalid => invalid > >> > > flash[:notice] = 'Definition was not deleted' > >> > > render :controller => :words, :action => "new" > >> > > end > >> > >> > > respond_to do |format| > >> > > format.html { redirect_to(words_url) } > >> > > end > >> > > end > >> > >> > > Thanks, > >> > > bp > >> > >> > I'm not sure how creating a method that sets the status attribute to > >> > "deleted" and saves the record would conflict with DRY principles? > >> > Also, it seems that the specifics of this what-would-be "mark_deleted" > >> > or maybe "set_status('deleted')" method is something the controller > >> > *probably* doesn't care about; more the controller just wants your > >> > model to perform a specific unit of logic. > >> > >> > Moreover, it doesn't make sense (as far as I can see) to call a > >> > separate controller's actions outside the realm of the HTTP redirect > >> > dance. Controllers exist to sit in between your user's request and the > >> > view/content that they want rendered back, having the appropriate > >> > models perform whatever actual logic is required to make this happen. > > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ 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@googlegroups.com To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---