Skip to main content

sort list in todos apps

todo.rb  
def sort_lists(lists, &block)
    incomplete_lists = {}
    complete_lists = {} 
    
    lists.each_with_index do |list, index|
      if list_complete?(list)
        complete_lists[list] = index
      else
        incomplete_lists[list] = index
      end
    end
    
    incomplete_lists.each(&block)
    complete_lists.each(&block)
  end
So here, this is under the helpers block. Code in the helpers block is accessible in erb view template and the main ruby files. "sort_lists" takes a lists object and a block. A lists object is a array that contains the hash object {name: "work" , todos: [] }. So now our objective is to break the lists into those that is incomplete list first, then completed second.

so we iterate through the lists's array, one by one, which yielded the list hash. Then we pass the list hash into the list_complete? method. Which select list hash who has at least one item in the todos array and also those list who has all completed list. Then , we store the list object in a complete_list's hash with the list hash as a key and the index as a value. If not completed, then those are stored in the incomplete_list hash.

Then we yield the incomplete_list hash first to the block , then we yield the second complete_list to the block.

lists.erb
<ul id="lists">
  <% sort_lists(@lists) do |list, index| %>
    <li class="<%= list_class(list) %>">
      <a href="/lists/<%= index %>">
        <h2><%= list[:name] %></h2>
        <p>
          <%= todos_remaining_count(list) %> / <%= todos_count(list) %>
        </p>
      </a> 
    </li>
  <% end %>

</ul>

The sort_list will pass those list in the  incomplete_list hash first to the block , then only the completed list hash into the block.

the sort_list will yield the list one by one. The list_class method will return the string "complete" if the list_complete? returns true. list_complete? will return true if  todos array count is more than 0 and todos_remaining_count is zero.

  def list_class(list)
    "complete" if list_complete?(list)
  end

  def todos_remaining_count(list)
    list[:todos].select { |todo| !todo[:completed] }.size
  end

todos_remaining_count will take a list hash, then it will access the todos array in the list hash , then select those todo that has a completed = true value. A todo object look like this {name: "work1" , completed: true }





Comments

Popular posts from this blog

Problem Solving - Refactored

I am going to outline how I approach problem solving. The relative importance and the amount of effort/time required for each is stated as a percentage beside each topic. I borrowed some idea from George Polya's How to Solve It Thoroughly Understand the Problem (30%) When encountering hard problem , you need to deeply understand the problem at hand. Take a paper and list down all known facts and data and what the question is trying to find. Sketch out the problem if applicable. Visualize the problem in your head. A lot of times, we only have to understand the problem well, then the solution will obvious. Have a Plan (20%) You need to have an outline of how you are going to tackle the problem. You need to have a logical pathway that will ultimate produce outcome (nothing to do with coding syntax yet). Without a plan, you are just randomly poking around and got lucky. No hard problem ever gets solved without a plan. Plan using pseudo-code, pen & paper or flowchart. Use wh...

My Burnout Experience

I want to share with you my experience of burning out. After registering with Launch School, I am extremely excited about my programming journey. I studied for 10 to 12 hours a day, memorizing fact, trying out practice problems, understanding programming concepts. It was fun and exciting and I love seeing myself growing from nothing in programming to something more. After about 3 months, thing starts to change. I started noticing myself paying less attention to details. I find myself skimming through the course material. I skip "Further Exploration" in the practice problem. I am more interested to study just to pass the assessment rather than truly mastering the concept. It was a gradual burning out process but I continue to study for 10 to 12 hours a day through sheer grit. It felt like doing house chore or working a day job that you don't like. One particular morning I woke up, and I remember this deep feeling of dread because I can anticipate that the next 10 to 1...

Explain code

get "/" do pattern = File . join ( data_path , "*" ) @files = Dir . glob ( pattern ) . map do | path | File . basename ( path ) end erb :index end def data_path if ENV [ "RACK_ENV" ] == "test" File . expand_path ( "../test/data" , __FILE__ ) else File . expand_path ( "../data" , __FILE__ ) end end data_path will check if ENV hash with key "RACK_ENV" has the value of "test". If yes, then return the path from root to cms2/test/data folder. If not , then return the absolute path from root to the folder cms2/data Then, in get "/" block , join the data_path with * . If in development environment, then data_path is home/cms2/data then the return value is home/cms2/data/* We use File.join is good because it will detect the OS, then join with appropriate character.  With the pattern in place, we use Dir.glob to find the files. Here it return home/...