Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Trimming the fat from your controllers

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Trimming the fat from your controllers

The slides from the talk on how to trim your controllers - given in #railsisrael

Avatar for Yonatan Bergman

Yonatan Bergman

November 12, 2012
Tweet

More Decks by Yonatan Bergman

Other Decks in Programming

Transcript

  1. class  EventsController  <  AppController            def

     create          event  =  Event.create(params[:event])          if  event.valid?      EventMailer.created_event(event)      .deliver              redirect_to  event_path(event)          else                ...  #  handle  error          end      end     end  
  2. class  EventsController  <  AppController            def

     create          event  =  Event.create(params[:event])          if  event.valid?      EventMailer.created_event(event)      .deliver              redirect_to  event_path(event)          else                ...  #  handle  error          end      end     end  
  3. class  EventsController  <  AppController            def

     create          event  =  Event.create(params[:event])          if  event.valid?      EventMailer.created_event(event)      .deliver              redirect_to  event_path(event)          else                ...  #  handle  error          end      end     end   ß really slow
  4. class  EventsController  <  AppController            def

     create          event  =  Event.create(params[:event])          if  event.valid?      EventMailer.delay.created_event(event)      redirect_to  event_path(event)          else                ...  #  handle  error          end      end     end   better
  5. class  Event  <  ActiveRecord::Base            after_create

     :send_creation_mail        ...          def  send_creation_mail          EventMailer.delay.created_event(event)      end     end  
  6. class  EventsController  <  AppController            def

     create          event  =  Event.create(params[:event])          if  event.valid?      redirect_to  event_path(event)          else                ...  #  handle  error          end      end     end   even better
  7. class  Event  <  ActiveRecord::Base    ...   end    

    BEST-ER! class  MailObserver  <  ActiveRecord::Observer        observe  :event        def  after_create(event)            EventMailer.delay.created_event(event)      end     end  
  8. class  EventsController  <  AppController            def

     create          event_params  =  params[:event].slice(…)          event_params.merge!(params[:venue])          event  =  Event.create(event_params)          event.link_user(      :user  =>  current_user,      :role  =>  :organizer          )          if  event.valid?              ...          ...    
  9. class  EventsController  <  AppController            def

     create          event_params  =  params[:event].slice(…)          event_params.merge!(params[:venue])          event  =  Event.create(event_params)          event.link_user(      :user  =>  current_user,      :role  =>  :organizer          )          if  event.valid?              ...          ...    
  10. class  EventsController  <  AppController            def

     create          event_params  =  params[:event].slice(…)          event_params.merge!(params[:venue])          event  =  Event.create(event_params)          event.link_user(      :user  =>  current_user,      :role  =>  :organizer          )          if  event.valid?              ...          ...    
  11. class  EventsController  <  AppController            def

     create          event_params  =  params[:event].slice(…)          event_params.merge!(params[:venue])          event  =  Event.create(event_params)          event.link_user(      :user  =>  current_user,      :role  =>  :organizer          )          if  event.valid?              ...          ...    
  12. class  EventsController  <  AppController            def

     create          event_params  =  params[:event].slice(…)          event_params.merge!(params[:venue])          event  =  Event.create(event_params)          event.link_user(      :user  =>  current_user,      :role  =>  :organizer          )          if  event.valid?              ...          ...    
  13. class  EventCreator  <  Creator      def  refine_params    

     params[:event].slice(…)          .merge(params[:venue])    end      def  after_build      event.link_user(          :user  =>  user,      :role  =>  :organizer)    end     end  
  14. class  EventCreator  <  Creator      def  refine_params    

     params[:event].slice(…)          .merge(params[:venue])    end      def  after_build      event.link_user(          :user  =>  user,      :role  =>  :organizer)    end     end  
  15. class  EventCreator  <  Creator      def  refine_params    

     params[:event].slice(…)          .merge(params[:venue])    end      def  after_build      event.link_user(          :user  =>  user,      :role  =>  :organizer)    end     end  
  16. class  EventCreator  <  Creator      def  refine_params    

     params[:event].slice(…)          .merge(params[:venue])    end      def  after_build      event.link_user(          :user  =>  user,      :role  =>  :organizer)    end     end  
  17. class  EventsController  <  AppController          def  create

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  18. class  EventsController  <  AppController          def  create

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  19. class  EventsController  <  AppController          def  create

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  20. class  EventsController  <  AppController          def  create

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  21. class  EventsController  <  AppController          def  create

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  22. PRESENTATION TITLE GOES HERE 44 class  EventsController  <  AppController  

           def  create   ...      def  create_invite      ...    end      def  delete_invite      ...    end     end  
  23. PRESENTATION TITLE GOES HERE 45 class  EventsController  <  AppController  

           def  create   ...      def  create_invite      ...    end      def  delete_invite      ...    end     end  
  24. routes.rb     resources  :events  do        

     member  do        post      “invite”  =>  “events#create_invite”      delete  “invite”  =>  “events#delete_invite”              end       end  
  25. PRESENTATION TITLE GOES HERE 48 class  InvitationController  <  AppController  

           def  create      ...    end      def  destroy      ...    end          ...  
  26. routes.rb     resources  :events  do        

     resources  :invites,  :only  =>  […]     end  
  27. PRESENTATION TITLE GOES HERE 50 class  EventsController  <  AppController  

           def  create      ...    end      ...     end  
  28. PRESENTATION TITLE GOES HERE 51 class  InvitationController  <  AppController  

           def  create      current_event.invitations.create(…)    end      def  destroy      ...    end          ...  
  29. PRESENTATION TITLE GOES HERE 52 class  InvitationController  <  AppController  

           def  create      current_event.invitations.create(…)    end      def  destroy      ...    end          ...  
  30. class  EventsController  <  AppController            

     def  current_event          Event.find(params[:id])      end     end   class  InvitationController  <  AppController              def  current_event          Event.find(params[…])      end     end  
  31. class  EventsController  <  AppController            

     def  current_event          Event.find(params[:id])      end     end   class  InvitationController  <  AppController              def  current_event          Event.find(params[…])      end     end  
  32. module  EventLoader              def  current_event

             Event.find(params[…])      end     end   class  EventsController  <  AppController          include  EventsLoader     end  
  33. module  EventLoader              def  current_event

             Event.find(params[…])      end     end   class  EventsController  <  AppController          include  EventsLoader     end  
  34. module  EventLoader              def  current_event

             Event.find(params[…])      end     end   class  EventsController  <  AppController          include  EventsLoader     end  
  35. module  EventLoader              def  current_event

             Event.find(params[…])      end     end   class  EventsController  <  AppController          include  EventsLoader     end  
  36. class  EventsController  <  AppController            

     include  EventsLoader        helper_method  :current_event     end   class  InvitationController  <  AppController              include  EventsLoader        helper_method  :current_event     end  
  37. class  EventsController  <  AppController            

     include  EventsLoader        helper_method  :current_event     end   class  InvitationController  <  AppController              include  EventsLoader        helper_method  :current_event     end  
  38. module  EventSupport        extend  ActiveSupport::Concern      

       included  do            helper_method  :current_event      end                  def  current_event          Event.find(params[…])      end     end  
  39. module  EventSupport        extend  ActiveSupport::Concern      

       included  do            helper_method  :current_event      end                  def  current_event          Event.find(params[…])      end     end  
  40. module  EventSupport        extend  ActiveSupport::Concern      

       included  do            helper_method  :current_event      end                  def  current_event          Event.find(params[…])      end     end  
  41. class  EventsController  <  AppController            

     include  EventSupport     end   class  InvitationController  <  AppController              include  EventSupport     end  
  42. module  OrganizerSupport        extend  ActiveSupport::Concern      

       include  EventSupport        def  can_edit_event?          current_event.organizer  ==  current_user      end     end  
  43. SUMMARY  app      |-­‐-­‐  controllers/      |-­‐-­‐  creators/

         `-­‐-­‐  observers/    lib      `-­‐-­‐  controller_supports/