Share
Embed
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
Transcript
74 slides
-
@yonbergman http://yonbergman.com Trimming the ( f a t ) f
r o m y o u r controllers -
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 -
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 -
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 -
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 -
class Event < ActiveRecord::Base after_create
:send_creation_mail ... def send_creation_mail EventMailer.delay.created_event(event) end end -
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 -
class Event < ActiveRecord::Base ... end
BEST-ER! class MailObserver < ActiveRecord::Observer observe :event def after_create(event) EventMailer.delay.created_event(event) end end -
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? ... ... -
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? ... ... -
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? ... ... -
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? ... ... -
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? ... ... -
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 -
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 -
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 -
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 -
class EventsController < AppController def create
creator = EventCreator.new(params, :user => current_user) if creator.save redirect_to event_path(creator.event) ... -
class EventsController < AppController def create
creator = EventCreator.new(params, :user => current_user) if creator.save redirect_to event_path(creator.event) ... -
class EventsController < AppController def create
creator = EventCreator.new(params, :user => current_user) if creator.save redirect_to event_path(creator.event) ... -
class EventsController < AppController def create
creator = EventCreator.new(params, :user => current_user) if creator.save redirect_to event_path(creator.event) ... -
class EventsController < AppController def create
creator = EventCreator.new(params, :user => current_user) if creator.save redirect_to event_path(creator.event) ... -
PRESENTATION TITLE GOES HERE 44 class EventsController < AppController
def create ... def create_invite ... end def delete_invite ... end end -
PRESENTATION TITLE GOES HERE 45 class EventsController < AppController
def create ... def create_invite ... end def delete_invite ... end end -
routes.rb resources :events do
member do post “invite” => “events#create_invite” delete “invite” => “events#delete_invite” end end -
PRESENTATION TITLE GOES HERE 48 class InvitationController < AppController
def create ... end def destroy ... end ... -
routes.rb resources :events do
resources :invites, :only => […] end -
PRESENTATION TITLE GOES HERE 50 class EventsController < AppController
def create ... end ... end -
PRESENTATION TITLE GOES HERE 51 class InvitationController < AppController
def create current_event.invitations.create(…) end def destroy ... end ... -
PRESENTATION TITLE GOES HERE 52 class InvitationController < AppController
def create current_event.invitations.create(…) end def destroy ... end ... -
class EventsController < AppController
def current_event Event.find(params[:id]) end end class InvitationController < AppController def current_event Event.find(params[…]) end end -
class EventsController < AppController
def current_event Event.find(params[:id]) end end class InvitationController < AppController def current_event Event.find(params[…]) end end -
module EventLoader def current_event
Event.find(params[…]) end end class EventsController < AppController include EventsLoader end -
module EventLoader def current_event
Event.find(params[…]) end end class EventsController < AppController include EventsLoader end -
module EventLoader def current_event
Event.find(params[…]) end end class EventsController < AppController include EventsLoader end -
module EventLoader def current_event
Event.find(params[…]) end end class EventsController < AppController include EventsLoader end -
class EventsController < AppController
include EventsLoader helper_method :current_event end class InvitationController < AppController include EventsLoader helper_method :current_event end -
class EventsController < AppController
include EventsLoader helper_method :current_event end class InvitationController < AppController include EventsLoader helper_method :current_event end -
module EventSupport extend ActiveSupport::Concern
included do helper_method :current_event end def current_event Event.find(params[…]) end end -
module EventSupport extend ActiveSupport::Concern
included do helper_method :current_event end def current_event Event.find(params[…]) end end -
module EventSupport extend ActiveSupport::Concern
included do helper_method :current_event end def current_event Event.find(params[…]) end end -
class EventsController < AppController
include EventSupport end class InvitationController < AppController include EventSupport end -
module OrganizerSupport extend ActiveSupport::Concern
include EventSupport def can_edit_event? current_event.organizer == current_user end end -
SUMMARY app |-‐-‐ controllers/ |-‐-‐ creators/
`-‐-‐ observers/ lib `-‐-‐ controller_supports/