In this refactoring I’m using extract method to split up the TimelogController#edit method. Right now it’s handling four separate actions:
- Display an empty form for a new
TimeEntry - Save a new
TimeEntry - Display a form for an existing
TimeEntry - Save an existing
TimeEntry
Normally these would be separate RESTful Rails actions; #new, #create, #edit, and #update. I’m going to start with extracting the #new method from #edit.
Before
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class TimelogController [:edit, :destroy] def edit (render_403; return) if @time_entry && !@time_entry.editable_by?(User.current) @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) @time_entry.attributes = params[:time_entry] call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) if request.post? and @time_entry.save flash[:notice] = l(:notice_successful_update) redirect_back_or_default :action => 'index', :project_id => @time_entry.project return end end end |
After
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class TimelogController [:new, :edit, :destroy] def new @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) @time_entry.attributes = params[:time_entry] call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) render :action => 'edit' end def edit (render_403; return) if @time_entry && !@time_entry.editable_by?(User.current) @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) @time_entry.attributes = params[:time_entry] call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) if request.post? and @time_entry.save flash[:notice] = l(:notice_successful_update) redirect_back_or_default :action => 'index', :project_id => @time_entry.project return end end end |
Even after this refactoring, there isn’t any code that can be removed from #edit. It looks like once I do a few more method extractions I’ll be able to remove some code, but until then I need to duplicate the method body.