CSC/ECE 517 Fall 2022 - E2254: Refactor teams controller.rb: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
m (Fixed formatting on code blocks)
(added info for fixes 8 and 9)
Line 27: Line 27:


=Changes=
=Changes=
* Fix #7:  
* Fixes #7 and #8:  
One of the main changes made to implement this was in <code>Team.rb</code> where the class method <code>copy_teams_to_collection</code> was added.<br>
One of the main changes made to implement this was in <code>Team.rb</code> where the class method <code>copy_teams_to_collection</code> was added.<br>
  <nowiki># E2254 : This method copies a list of teams to another collection. It is mainly
  <nowiki># E2254 : This method copies a list of teams to another collection. It is mainly
Line 54: Line 54:
   ...
   ...
end</nowiki>
end</nowiki>
* Fix #9:
Refactored bequeath_all to get rid of all the nested if statements
<nowiki>  # Copies existing teams from an assignment to a
  # course if the course doesn't already have teams
  def bequeath_all
    assignment = Assignment.find(params[:id])
    course = Course.find(assignment.course_id) if assignment.course_id
    if !assignment.course_id
      flash[:error] = 'No course was found for this assignment.'
    elsif course.course_teams.any?
      flash[:error] = 'The course already has associated teams'
    else
      teams = assignment.teams
      Team.copy_teams_to_collection(teams, course.id)
      flash[:note] = teams.length.to_s + ' teams were successfully copied to "' + course.name + '"'
    end
    redirect_to controller: 'teams', action: 'list', id: assignment.id
  end</nowiki>
Also, the multiple returns have been removed from the method. The redirect and return for the check to ensure
a course team was being used was moved to it's own method:
<nowiki>  # Redirects if the team is not a CourseTeam
  def ensure_course_team
    if session[:team_type] == 'Course'
      flash[:error] = 'Invalid team type for bequeathal'
      redirect_to controller: 'teams', action: 'list', id: params[:id]
    end
  end</nowiki>
and specified to run at before the <code>bequeath_all</code> method at the start of the file:
<nowiki>before_action :ensure_course_team, only: %i[bequeath_all]</nowiki>

Revision as of 19:14, 26 October 2022

Introduction

In this project we refactored teams_controller.rb and some tests associated with it. Before we worked on it, teams_controller.rb had some problems that violated some essential Rails design principles. Some methods have been moved to the teams.rb model class. Some duplicate code was removed. We added some comments for readability. And, we fixed tests to be more consistent with the program and execution.

Issues Fixed

  1. Added more comments and briefly explained the functionality of custom methods like action_allowed, and list
  2. Changed method name of create_teams to a better name: random_teams
  3. Found areas in the code where the DRY principle can be applied and did so
  4. The delete method manipulates a waitlist! This needs to be done in a model class, e.g., SignedUpTeam. And also check if this code is already present in the model or not. Explore the code base to find where else waitlist is manipulated.
    • Changed the delete method to use the existing Waitlist.remove_from_waitlists method to handle removing the deleted team from all waitlists
  5. Removed all extra added gems
  6. Renamed variable signUps to signups because it's a noun
    • Actually ended up removing this variable in the process of doing fix 4 above
  7. Moved list copying code from the inherit method to be a class method of the Team model: copy_teams_to_collection. Also replaced identical code in bequeath_all to also use this class method.
  8. Changed the name of the inherit method to copy_to_assignment so the name is more descriptive of it's purpose
  9. Removed nested if statments and removed other return points from bequeath_all
  10. Removed unnecessary comments for methods like update and added meaningful comments to other methods

Files Changed

  • app/controllers/teams_controller.rb
  • app/models/team.rb
  • app/views/teams/new.html.erb
  • config/locales/en_US.yml
  • config/locales/en_IN.yml
  • config/routes.rb
  • spec/controllers/teams_controller_spec.rb
  • spec/controllers/airbrake_exception_errors_controller_tests_spec.rb

Changes

  • Fixes #7 and #8:

One of the main changes made to implement this was in Team.rb where the class method copy_teams_to_collection was added.

# E2254 : This method copies a list of teams to another collection. It is mainly
# used in the Team model for copy_to_assignment and bequeath_all for the purpose of copying
# teams from assignments to courses and vice versa.
def self.copy_teams_to_collection(teams, recipient_collection_id)
  teams.each do |team|
    team.copy(recipient_collection_id)
  end
end

This method was called in teams_controller.rb in the copy_to_assignment (method used to be named inherit) and bequeath_all methods.

def copy_to_assignment
  ...
  if teams.empty?
    flash[:note] = 'No teams were found when trying to copy to assignment.'
  else
    Team.copy_teams_to_collection(teams, assignment.id)
  end
  ...
end
def bequeath_all
  ...
  teams = assignment.teams
  Team.copy_teams_to_collection(teams, course.id)
  flash[:note] = teams.length.to_s + ' teams were successfully copied to "' + course.name + '"'
  ...
end
  • Fix #9:

Refactored bequeath_all to get rid of all the nested if statements

  # Copies existing teams from an assignment to a
  # course if the course doesn't already have teams
  def bequeath_all
    assignment = Assignment.find(params[:id])
    course = Course.find(assignment.course_id) if assignment.course_id

    if !assignment.course_id
      flash[:error] = 'No course was found for this assignment.'
    elsif course.course_teams.any?
      flash[:error] = 'The course already has associated teams'
    else
      teams = assignment.teams
      Team.copy_teams_to_collection(teams, course.id)
      flash[:note] = teams.length.to_s + ' teams were successfully copied to "' + course.name + '"'
    end
    redirect_to controller: 'teams', action: 'list', id: assignment.id
  end

Also, the multiple returns have been removed from the method. The redirect and return for the check to ensure a course team was being used was moved to it's own method:

  # Redirects if the team is not a CourseTeam
  def ensure_course_team
    if session[:team_type] == 'Course'
      flash[:error] = 'Invalid team type for bequeathal'
      redirect_to controller: 'teams', action: 'list', id: params[:id]
    end
  end

and specified to run at before the bequeath_all method at the start of the file:

before_action :ensure_course_team, only: %i[bequeath_all]