<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vramach</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vramach"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Vramach"/>
	<updated>2026-07-02T10:26:22Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98666</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98666"/>
		<updated>2015-11-07T02:26:00Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* TreeDisplayController */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
We used the DRY principle while refactoring our code to remove duplicates in get_children_node_ng and get_children_node_2_ng methods.&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods: populate_rows,populate_1_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. (Click on the name of the Course/Asignment/Questionnaire to expand them)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
From the home directory of the application, run the test as &amp;quot;rspec spec/controllers/tree_display_controller_spec.rb&amp;quot;&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98665</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98665"/>
		<updated>2015-11-07T02:25:20Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* TreeDisplayController */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
We used the DRY principle while refactoring our code to remove duplicates in get_children_node_ng and get_children_node_2_ng methods.&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,populate_1_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. (Click on the name of the Course/Asignment/Questionnaire to expand them)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
From the home directory of the application, run the test as &amp;quot;rspec spec/controllers/tree_display_controller_spec.rb&amp;quot;&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98664</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98664"/>
		<updated>2015-11-07T02:24:46Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Changes Made */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
We used the DRY principle while refactoring our code to remove duplicates in get_children_node_ng and get_children_node_2_ng methods.&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. (Click on the name of the Course/Asignment/Questionnaire to expand them)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
From the home directory of the application, run the test as &amp;quot;rspec spec/controllers/tree_display_controller_spec.rb&amp;quot;&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98663</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98663"/>
		<updated>2015-11-07T02:14:09Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Rspec Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. (Click on the name of the Course/Asignment/Questionnaire to expand them)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
From the home directory of the application, run the test as &amp;quot;rspec spec/controllers/tree_display_controller_spec.rb&amp;quot;&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98662</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98662"/>
		<updated>2015-11-07T02:12:41Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* How to test the changes from UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. (Click on the name of the Course/Asignment/Questionnaire to expand them)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98661</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98661"/>
		<updated>2015-11-07T02:11:11Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* How to test the changes from UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98660</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98660"/>
		<updated>2015-11-07T02:10:54Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* How to test the changes from UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''How to test the changes from UI'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98659</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98659"/>
		<updated>2015-11-07T02:10:17Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* How to test the changes from UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|--&amp;gt;&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
&amp;lt;!--|-&lt;br /&gt;
|}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98658</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98658"/>
		<updated>2015-11-07T02:09:09Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Removing duplicate methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98657</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98657"/>
		<updated>2015-11-07T02:08:36Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Removing duplicate methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98655</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98655"/>
		<updated>2015-11-07T02:02:16Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Rspec Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98654</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98654"/>
		<updated>2015-11-07T02:01:10Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Method Removal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98653</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98653"/>
		<updated>2015-11-07T02:00:19Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- } --&amp;gt;&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
'This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|--&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98645</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98645"/>
		<updated>2015-11-07T01:50:26Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98644</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98644"/>
		<updated>2015-11-07T01:50:05Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* populate_1_row */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98640</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98640"/>
		<updated>2015-11-07T01:47:56Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Checking the direct access tabs from navigation bar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98639</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98639"/>
		<updated>2015-11-07T01:47:41Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Checking the direct access tabs from navigation bar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Rsz questionnaires.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires.jpg&amp;diff=98638</id>
		<title>File:Rsz questionnaires.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires.jpg&amp;diff=98638"/>
		<updated>2015-11-07T01:46:35Z</updated>

		<summary type="html">&lt;p&gt;Vramach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98634</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98634"/>
		<updated>2015-11-07T01:43:52Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Checking the sub categories in each parent Tree */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98632</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98632"/>
		<updated>2015-11-07T01:43:35Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Checking the sub categories in each parent Tree */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Rsz sub tree traversal.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98629</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98629"/>
		<updated>2015-11-07T01:42:35Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Direct access to sub categories in tree display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage menu traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Sub-tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98627</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98627"/>
		<updated>2015-11-07T01:41:44Z</updated>

		<summary type="html">&lt;p&gt;Vramach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Review rubrics screenshot.png |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Sub-tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98624</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98624"/>
		<updated>2015-11-07T01:38:31Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Direct access to sub categories in tree display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Manage tree traversal.jpg |center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Sub-tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_sub_tree_traversal.jpg&amp;diff=98623</id>
		<title>File:Rsz sub tree traversal.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_sub_tree_traversal.jpg&amp;diff=98623"/>
		<updated>2015-11-07T01:36:27Z</updated>

		<summary type="html">&lt;p&gt;Vramach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_menu_traversal.jpg&amp;diff=98622</id>
		<title>File:Manage menu traversal.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_menu_traversal.jpg&amp;diff=98622"/>
		<updated>2015-11-07T01:35:50Z</updated>

		<summary type="html">&lt;p&gt;Vramach: uploaded a new version of &amp;amp;quot;File:Manage menu traversal.jpg&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98614</id>
		<title>CSC/ECE 517 Fall 2015/oss E1570 avr</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2015/oss_E1570_avr&amp;diff=98614"/>
		<updated>2015-11-07T01:32:02Z</updated>

		<summary type="html">&lt;p&gt;Vramach: /* Direct access to sub categories in tree display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''E1570. Refactoring TreeDisplayController'''&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. This project aimed at refactoring the TreeDisplayController.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction to Expertiza=&lt;br /&gt;
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). The Expertiza project is supported by the National Science Foundation.&amp;lt;ref&amp;gt;[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://wikis.lib.ncsu.edu/index.php/Expertiza Wiki]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problem Statement =&lt;br /&gt;
'''Classes involved:'''&lt;br /&gt;
 tree_display_controller.rb&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Controller Responsibilities:'''&lt;br /&gt;
This controller deals with displaying “trees” of objects to the instructor.  When an instructor logs in, (s)he is greeted with a homepage that lists questionnaires (rubrics, quizzes, surveys), courses, and assignments.  These objects are displayed in a “tree,” allowing the user to click on the top-level object and see the objects beneath it.&lt;br /&gt;
&lt;br /&gt;
'''Bad practices followed:'''&lt;br /&gt;
* Many Duplicate Methods.&lt;br /&gt;
* Very Long Methods combining many Functionalities.&lt;br /&gt;
* Redundant methods not being used anywhere.&lt;br /&gt;
&lt;br /&gt;
'''Refactoring to be done:'''&lt;br /&gt;
#   Split  &amp;lt;font face=Courier New&amp;gt;get_children_node_ng &amp;lt;/font&amp;gt; and &amp;lt;font face=Courier New&amp;gt;get_children_node_2_ng &amp;lt;/font&amp;gt; into smaller methods and give reasonable names to them and make sure implement common code in a single method.&lt;br /&gt;
#   Merge  all the repeating methods into a single method.&lt;br /&gt;
#   Write functional tests for the TreeDispayController.&lt;br /&gt;
#   Remove commented code in list method.&lt;br /&gt;
&lt;br /&gt;
=Changes Made=&lt;br /&gt;
&lt;br /&gt;
==TreeDisplayController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| goto_questionnaires, goto_review_rubrics, goto_metareview_rubrics, goto_teammatereview_rubrics, goto_author_feedbacks, goto_global_survey, goto_surveys, goto_course_evaluations, goto_courses, goto_assignments&lt;br /&gt;
| All these methods were merged into a single method with name go_to_menu_items which receives a parameter of the name of tree_folder object, such as &amp;quot;Questionnaires&amp;quot;.&lt;br /&gt;
|Since all the methods were performing the same action, i.e passing the node object id to list method in TreeDisplayController, the name is passed a parameter to the go_to_menu_items method from &amp;quot;link&amp;quot; method in MenuItemsController. Using this parameter the respective object and its ID are found and is redirected to &amp;quot;list&amp;quot; method.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_ng&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Moved part of the code from these methods to newly created methods populate_rows,display_row,page_render methods.&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | These Methods had many functionalities being implemented which made the method look lengthy and moreover these methods were performing almost similar functions which could be grouped together and reduce the overall code length.&lt;br /&gt;
|-&lt;br /&gt;
| get_children_node_2_ng&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MenuItemsController==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|-------&lt;br /&gt;
| link&lt;br /&gt;
| Redirect url only for the menu_items altered in TreeDisplayController is changed to go_to_menu_items_url.&lt;br /&gt;
| Since the 10 methods had been merged into one method in TreeDisplayController, the redirect url is set to go_to_menu_items url. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''How to test the changes from UI'''===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Login in as an instructor or admin using credentials (admin with password: admin or instructor6 with password: password)&lt;br /&gt;
* To check the changes made in go_to_menu_items method, hover over the Manage tab in the navigation bar on the top  and click all the links and check whether they are being redirected to correct pages. For example, if Questionnaires is clicked, you should be | redirected directly to the page displaying all the questionnaires with its sub-categories like Reviews, Surveys etc.&lt;br /&gt;
* To test the changes made in get_children_node_ng and get_children_node_2_ng methods, click on the sub categories under each of the parent tree displays (Courses, Assignments and Questionnaires) and all of them will further expand to show the details. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Direct access to sub categories in tree display=&lt;br /&gt;
[[File:Review rubrics screenshot.png |thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Checking the direct access tabs from navigation bar=&lt;br /&gt;
[[File:Tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
=Checking the sub categories in each parent Tree=&lt;br /&gt;
[[File:Sub-tree screenshot.png]]&lt;br /&gt;
&lt;br /&gt;
= Re-factored Code =&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      tmpRes[fnode.get_name] = ch_nodes&lt;br /&gt;
&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for nodeType in tmpRes.keys&lt;br /&gt;
      res[nodeType] =  Array.new&lt;br /&gt;
&lt;br /&gt;
      for node in tmpRes[nodeType]&lt;br /&gt;
        tmpObject = {}&lt;br /&gt;
        tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
        tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
        tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
&lt;br /&gt;
        if nodeType == 'Courses' || nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
          tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
          tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
          tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
          tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
          instructor_id = node.get_instructor_id&lt;br /&gt;
          tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
&lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
          if nodeType == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
            tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
            tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
            tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
            tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
            tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
            tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res[nodeType] &amp;lt;&amp;lt; tmpObject&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
   def get_children_node_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    ch_nodes = {}&lt;br /&gt;
    for node in childNodes&lt;br /&gt;
      # Declaring Foldernode Object as New&lt;br /&gt;
      fnode = eval(params[:reactParams][:nodeType]).new&lt;br /&gt;
      for a in node&lt;br /&gt;
        fnode[a[0]] = a[1]&lt;br /&gt;
      end&lt;br /&gt;
      # fnode is the parent node&lt;br /&gt;
      # ch_nodes are childrens&lt;br /&gt;
      ch_nodes[fnode.get_name] = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
      # cnode = fnode.get_children(&amp;quot;created_at&amp;quot;, &amp;quot;desc&amp;quot;, 2, nil, nil)&lt;br /&gt;
    end&lt;br /&gt;
      call_function =&amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      #Render JSON of the child nodes&lt;br /&gt;
      populate_rows(ch_nodes,call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Refactoring get_children_node_2_ng method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_children_node_2_ng&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
    tmpRes = {}&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
    tmpRes = ch_nodes&lt;br /&gt;
    if tmpRes&lt;br /&gt;
      for child in tmpRes&lt;br /&gt;
        nodeType = child.type&lt;br /&gt;
        res2 = {}&lt;br /&gt;
        res2[&amp;quot;nodeinfo&amp;quot;] = child&lt;br /&gt;
        res2[&amp;quot;name&amp;quot;] = child.get_name&lt;br /&gt;
        res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
        res2[&amp;quot;type&amp;quot;] = nodeType&lt;br /&gt;
&lt;br /&gt;
        res2[&amp;quot;private&amp;quot;] = child.get_private&lt;br /&gt;
        res2[&amp;quot;creation_date&amp;quot;] = child.get_creation_date&lt;br /&gt;
        res2[&amp;quot;updated_date&amp;quot;] = child.get_modified_date&lt;br /&gt;
        if nodeType == 'CourseNode' || nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
          res2[&amp;quot;directory&amp;quot;] = child.get_directory&lt;br /&gt;
          instructor_id = child.get_instructor_id&lt;br /&gt;
          res2[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
          unless (instructor_id.nil?)&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
          else&lt;br /&gt;
            res2[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          res2[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; &lt;br /&gt;
Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(child))&lt;br /&gt;
          if nodeType == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
            res2[&amp;quot;course_id&amp;quot;] = child.get_course_id&lt;br /&gt;
            res2[&amp;quot;max_team_size&amp;quot;] = child.get_max_team_size&lt;br /&gt;
            res2[&amp;quot;is_intelligent&amp;quot;] = child.get_is_intelligent&lt;br /&gt;
            res2[&amp;quot;require_quiz&amp;quot;] = child.get_require_quiz&lt;br /&gt;
            res2[&amp;quot;allow_suggestions&amp;quot;] = child.get_allow_suggestions&lt;br /&gt;
            res2[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', child.node_object_id]).first ? true : false&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        res &amp;lt;&amp;lt; res2&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: res}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 def get_children_node_2_ng&lt;br /&gt;
    # Second Level of Tree Display with Children Nodes&lt;br /&gt;
    childNodes = {}&lt;br /&gt;
    if params[:reactParams2][:child_nodes].is_a? String&lt;br /&gt;
      childNodes = JSON.parse(params[:reactParams2][:child_nodes])&lt;br /&gt;
    else&lt;br /&gt;
      childNodes = params[:reactParams2][:child_nodes]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
    fnode = eval(params[:reactParams2][:nodeType]).new&lt;br /&gt;
    childNodes.each do |key, value|&lt;br /&gt;
      fnode[key] = value&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ch_nodes = fnode.get_children(nil, nil, session[:user].id, nil, nil)&lt;br /&gt;
&lt;br /&gt;
    call_function = &amp;quot;get_children_node_2_ng&amp;quot;&lt;br /&gt;
    populate_rows(ch_nodes, call_function)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Common Methods Added to get_children_node_ng and get_children_node_2_ng controllers ==&lt;br /&gt;
&lt;br /&gt;
===populate_rows ===&lt;br /&gt;
  &lt;br /&gt;
This is a new Common Method for both get_children_node_ng and get_children_node_2_ng  that does the functionality of rendering a page with data from all nodes by calling another method populate_1_row(). There is another Method call that happens in this method which as a whole renders the List View.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! |populate_rows()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_rows(list,call_function) #render page with data for all nodes in list&lt;br /&gt;
    if call_function == &amp;quot;get_children_node_ng&amp;quot;&lt;br /&gt;
      tmpRes ={}&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = {}&lt;br /&gt;
       for nodeType in tmpRes.keys&lt;br /&gt;
        # declaring a new array&lt;br /&gt;
        res[nodeType] =  Array.new&lt;br /&gt;
        for node in tmpRes[nodeType]&lt;br /&gt;
          res[nodeType] &amp;lt;&amp;lt; populate_1_row(node)&lt;br /&gt;
        end&lt;br /&gt;
       end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      tmpRes = list&lt;br /&gt;
      res = []&lt;br /&gt;
      if tmpRes&lt;br /&gt;
        for child in tmpRes&lt;br /&gt;
          res2 = {}&lt;br /&gt;
          res2 = populate_1_row(child)&lt;br /&gt;
          res2[&amp;quot;key&amp;quot;] = params[:reactParams2][:key]&lt;br /&gt;
          res &amp;lt;&amp;lt; res2&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    page_render(res)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===populate_1_row ===&lt;br /&gt;
&lt;br /&gt;
  This is a new Method that is called from Method populate_row() and fetches all the child node names from respective Controller actions and then populates the tmpObject.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |populate_1_row()&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def populate_1_row(node) #return JSON for 1 Node&lt;br /&gt;
    tmpObject = {}&lt;br /&gt;
    tmpObject[&amp;quot;nodeinfo&amp;quot;] = node&lt;br /&gt;
    # all the child nodes names got and put in tmpObject from respective controller actions&lt;br /&gt;
    tmpObject[&amp;quot;name&amp;quot;] = node.get_name&lt;br /&gt;
    tmpObject[&amp;quot;type&amp;quot;] = node.type&lt;br /&gt;
    if node.type == 'CourseNode' || node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
      tmpObject[&amp;quot;directory&amp;quot;] = node.get_directory&lt;br /&gt;
      tmpObject[&amp;quot;creation_date&amp;quot;] = node.get_creation_date&lt;br /&gt;
      tmpObject[&amp;quot;updated_date&amp;quot;] = node.get_modified_date&lt;br /&gt;
      tmpObject[&amp;quot;private&amp;quot;] = node.get_private&lt;br /&gt;
      instructor_id = node.get_instructor_id&lt;br /&gt;
      tmpObject[&amp;quot;instructor_id&amp;quot;] = instructor_id&lt;br /&gt;
      unless (instructor_id.nil?)&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = User.find(instructor_id).name&lt;br /&gt;
      else&lt;br /&gt;
        tmpObject[&amp;quot;instructor&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      tmpObject[&amp;quot;is_available&amp;quot;] = is_available(session[:user], instructor_id) || (session[:user].role_id == 6 &amp;amp;&amp;amp; Ta.get_my_instructors(session[:user].id).include?(instructor_id) &amp;amp;&amp;amp; ta_for_current_course?(node))&lt;br /&gt;
      if node.type == &amp;quot;AssignmentNode&amp;quot;&lt;br /&gt;
        tmpObject[&amp;quot;course_id&amp;quot;] = node.get_course_id&lt;br /&gt;
        tmpObject[&amp;quot;max_team_size&amp;quot;] = node.get_max_team_size&lt;br /&gt;
        tmpObject[&amp;quot;is_intelligent&amp;quot;] = node.get_is_intelligent&lt;br /&gt;
        tmpObject[&amp;quot;require_quiz&amp;quot;] = node.get_require_quiz&lt;br /&gt;
        tmpObject[&amp;quot;allow_suggestions&amp;quot;] = node.get_allow_suggestions&lt;br /&gt;
        tmpObject[&amp;quot;has_topic&amp;quot;] = SignUpTopic.where(['assignment_id = ?', node.node_object_id]).first ? true : false&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    tmpObject&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===page_render ===&lt;br /&gt;
&lt;br /&gt;
  This is also a common Method which integrates the rendering functionality of get_children_node_ng and get_children_node_2_ng making sure both levels are properly populated in the view.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def page_render(list) # Common Render Functionality for get_children_node_ng and get_children_node_2_ng methods&lt;br /&gt;
    respond_to do |format|&lt;br /&gt;
      format.html {render json: list}&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== Method Removal==&lt;br /&gt;
 There was a Method which dint have any Routes defined in the Routes.rb file and was not called in any of the Controller . After Careful analysis we descided to remove the method from the tree Display Controller.&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |filter &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
  def filter&lt;br /&gt;
    search = params[:filter_string]&lt;br /&gt;
    filter_node = params[:filternode]&lt;br /&gt;
    qid = 'filter+'&lt;br /&gt;
&lt;br /&gt;
    if filter_node == 'QAN'&lt;br /&gt;
      assignment = Assignment.find_by_name(search)&lt;br /&gt;
      if assignment&lt;br /&gt;
        assignment_questionnaires = AssignmentQuestionnaire.where(assignment_id: assignment.id)&lt;br /&gt;
        if assignment_questionnaires&lt;br /&gt;
          assignment_questionnaires.each { |q|  qid &amp;lt;&amp;lt; &amp;quot;#{q.questionnaire_id.to_s}+&amp;quot; }&lt;br /&gt;
          session[:root] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    elsif filter_node == 'ACN'&lt;br /&gt;
      session[:root] = 2&lt;br /&gt;
      qid &amp;lt;&amp;lt;  search&lt;br /&gt;
    end&lt;br /&gt;
    return qid&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Removing duplicate methods==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Before Changes&lt;br /&gt;
! |After Changes &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
# direct access to questionnaires&lt;br /&gt;
  def goto_questionnaires&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Questionnaires')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to review rubrics&lt;br /&gt;
  def goto_review_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to metareview rubrics&lt;br /&gt;
  def goto_metareview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Metareview')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to teammate review rubrics&lt;br /&gt;
  def goto_teammatereview_rubrics&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Teammate Review')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to author feedbacks&lt;br /&gt;
  def goto_author_feedbacks&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Author Feedback')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to global survey&lt;br /&gt;
  def goto_global_survey&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Global Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to surveys&lt;br /&gt;
  def goto_surveys&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Survey')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to course evaluations&lt;br /&gt;
  def goto_course_evaluations&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Course Evaluation')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to courses&lt;br /&gt;
  def goto_courses&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Courses')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # direct access to assignments&lt;br /&gt;
  def goto_assignments&lt;br /&gt;
    node_object = TreeFolder.find_by_name('Assignments')&lt;br /&gt;
    session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
    redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 # direct access&lt;br /&gt;
 def go_to_menu_items&lt;br /&gt;
    name = params[:params1]&lt;br /&gt;
    if name&lt;br /&gt;
      if name == &amp;quot;Review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          name = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          name = &amp;quot;Author Feedback&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          name = &amp;quot;Global Survey&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          name = &amp;quot;Course Evaluation&amp;quot;&lt;br /&gt;
        elsif name == &amp;quot;Surveys&amp;quot;&lt;br /&gt;
            name = &amp;quot;Survey&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      node_object = TreeFolder.find_by_name(name)&lt;br /&gt;
              session[:root] = FolderNode.find_by_node_object_id(node_object.id).id&lt;br /&gt;
      if node_object.name == &amp;quot;Courses&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 1&lt;br /&gt;
      elsif node_object.name == &amp;quot;Assignments&amp;quot;&lt;br /&gt;
              session[:last_open_tab] = 2&lt;br /&gt;
      elsif (node_object.id ==1 ||node_object.id ==4 ||node_object.id ==5 ||&lt;br /&gt;
              node_object.id ==6 ||node_object.id ==7 ||node_object.id ==8 ||node_object.id ==9||&lt;br /&gt;
              node_object.id ==10) # if node_object_name is Questionnaires or its child_nodes&lt;br /&gt;
           session[:last_open_tab] = 3   # for Questionnaires and all its childnodes&lt;br /&gt;
      end&lt;br /&gt;
           redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
    else        # if the passed params is null, redirect to root&lt;br /&gt;
           redirect_to &amp;quot;/&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Rspec Test==&lt;br /&gt;
&lt;br /&gt;
  We have written Rspec tests for the tree_display_controller and have run the same with success.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |page_render() &lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
&lt;br /&gt;
describe TreeDisplayController do&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#list&amp;quot; do&lt;br /&gt;
    it &amp;quot;should not redirect to student_task controller if current user is an instructor&amp;quot; do&lt;br /&gt;
      allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(false)&lt;br /&gt;
      post &amp;quot;list&amp;quot;&lt;br /&gt;
      response.should_not redirect_to(list_student_task_index_path)&lt;br /&gt;
end&lt;br /&gt;
    it &amp;quot;should redirect to student_task controller if current user is a student&amp;quot; do&lt;br /&gt;
       allow(session[:user]).to receive(&amp;quot;student?&amp;quot;).and_return(true)&lt;br /&gt;
       post &amp;quot;list&amp;quot;&lt;br /&gt;
       response.should redirect_to(list_student_task_index_path)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
describe &amp;quot;#ta_for_current_mappings?&amp;quot; do&lt;br /&gt;
    it &amp;quot;should return true if current user is a TA for current course&amp;quot; do&lt;br /&gt;
        allow(session[:user]).to receive(&amp;quot;ta?&amp;quot;).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_rows&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_rows).with(Hash, String)}&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
      dbl.populate_rows({},&amp;quot;&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
describe &amp;quot;#populate_1_row&amp;quot; do&lt;br /&gt;
    let(:dbl) { double }&lt;br /&gt;
  before { expect(dbl).to receive(:populate_1_row).with(Node) }&lt;br /&gt;
     it &amp;quot;passes when the arguments match&amp;quot; do&lt;br /&gt;
        dbl.populate_1_row(Node.new)&lt;br /&gt;
     end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  describe &amp;quot;#go_to_menu_items&amp;quot; do&lt;br /&gt;
    before do&lt;br /&gt;
          allow(nil).to receive(:find_by_node_object_id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:id).and_return(nil)&lt;br /&gt;
          allow(nil).to receive(:name).and_return(true)&lt;br /&gt;
    end&lt;br /&gt;
      it &amp;quot;should receive Review Rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Review Rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Teammate review rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Teammate review&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Teammate review rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Metareview rubrics and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Metareview&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Metareview rubrics&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Author feedbacks and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Author Feedback&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Author feedbacks&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Global surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Global Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Global surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Course evaluations and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Course Evaluation&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Course evaluations&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should receive Surveys and redirect to list&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(&amp;quot;Survey&amp;quot;).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;, params1: &amp;quot;Surveys&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
      it &amp;quot;should redirect to root_url if request parameter is invalid&amp;quot; do&lt;br /&gt;
          allow(nil).to receive(:find_by_name).with(nil).and_return(nil)&lt;br /&gt;
          get &amp;quot;go_to_menu_items&amp;quot;&lt;br /&gt;
          expect(response).to redirect_to(root_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    describe &amp;quot;#drill&amp;quot; do&lt;br /&gt;
      it &amp;quot;redirect to list action&amp;quot; do&lt;br /&gt;
           get &amp;quot;drill&amp;quot; , root: 1&lt;br /&gt;
           session[:root].should == &amp;quot;1&amp;quot;&lt;br /&gt;
           expect(response).to redirect_to(list_tree_display_index_path)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_menu_traversal.jpg&amp;diff=98612</id>
		<title>File:Manage menu traversal.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_menu_traversal.jpg&amp;diff=98612"/>
		<updated>2015-11-07T01:30:32Z</updated>

		<summary type="html">&lt;p&gt;Vramach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vramach</name></author>
	</entry>
</feed>