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

Trimming the fat from your controllers

Trimming the fat from your controllers

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

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/