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

2f7eb8e439ce2d288dcfa240b5210664?s=128

Yonatan Bergman

November 12, 2012
Tweet

Transcript

  1. @yonbergman http://yonbergman.com Trimming the ( f a t ) f

    r o m y o u r controllers
  2. THE PROBLEM Writing code => easy Deleting code => hard

  3. @yonbergman

  4. None
  5. TECH LEAD SOCIAL TICKETS

  6. A NEW PROJECT APPEARS!

  7. None
  8. None
  9. None
  10. None
  11. None
  12. None
  13. None
  14. 470 310 251 76 LOC PER PROJECT

  15. 470 76

  16. 470 76

  17. None
  18. 470 76

  19. 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  
  20. 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  
  21. 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
  22. 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
  23. class  Event  <  ActiveRecord::Base            after_create

     :send_creation_mail        ...          def  send_creation_mail          EventMailer.delay.created_event(event)      end     end  
  24. 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
  25. class  Event  <  ActiveRecord::Base    ...   end    

    BEST-ER! class  MailObserver  <  ActiveRecord::Observer        observe  :event        def  after_create(event)            EventMailer.delay.created_event(event)      end     end  
  26. RECAP Controllers should Control app/observers unlocked!

  27. 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?              ...          ...    
  28. 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?              ...          ...    
  29. 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?              ...          ...    
  30. 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?              ...          ...    
  31. 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?              ...          ...    
  32. CREATORS* *WIP

  33. 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  
  34. 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  
  35. 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  
  36. 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  
  37. class  EventsController  <  AppController          def  create

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

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

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

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

         creator  =  EventCreator.new(params,                    :user  =>  current_user)              if  creator.save          redirect_to  event_path(creator.event)        ...  
  42. RECAP Invent paradigms* *when needed app/creators unlocked!

  43. RAILS 4 PRESENTATION TITLE GOES HERE 43 gem   ‘strong_parameters’

     
  44. PRESENTATION TITLE GOES HERE 44 class  EventsController  <  AppController  

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

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

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

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

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

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

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

           def  create      current_event.invitations.create(…)    end      def  destroy      ...    end          ...  
  53. RECAP Mo’ controllers Less problems app/controllers unlocked!

  54. class  EventsController  <  AppController            

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

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

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

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

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

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

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

     include  EventsLoader        helper_method  :current_event     end   class  InvitationController  <  AppController              include  EventsLoader        helper_method  :current_event     end  
  63. None
  64. CONTROLLER SUPPORTS

  65. PRESENTATION TITLE GOES HERE 65 ActiveSupport::Concern  

  66. module  EventSupport        extend  ActiveSupport::Concern      

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

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

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

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

       include  EventSupport        def  can_edit_event?          current_event.organizer  ==  current_user      end     end  
  71. RECAP Separate ----------------- concerns! lib/controller_support unlocked!

  72. SUMMARY  app      |-­‐-­‐  controllers/      |-­‐-­‐  creators/

         `-­‐-­‐  observers/    lib      `-­‐-­‐  controller_supports/  
  73. jobs-il@ebay.com We’re hiring

  74. THANKS. @yonbergman