Ruby Build a Todo List Application with Rails 4 Build a Todo List Application with Rails 4 Marking Todo Items Complete

janeporter
PRO
janeporter
Pro Student 23,471 Points

No route matches [GET] "/todo_lists/1/todo_items/9/complete" error

I'm getting a routing error as follows:

Routing Error
No route matches [GET] "/todo_lists/1/todo_items/9/complete"

Rails.root: C:/Users/jporter/Documents/ruby_projects_tth/odot

Application Trace | Framework Trace | Full Trace
Routes

Routes match in priority from top to bottom

Helper  HTTP Verb   Path    Controller#Action
Path / Url      
Path Match
complete_todo_list_todo_item_path   PATCH   /todo_lists/:todo_list_id/todo_items/:id/complete(.:format) todo_items#complete
todo_list_todo_items_path   GET /todo_lists/:todo_list_id/todo_items(.:format)  todo_items#index
POST    /todo_lists/:todo_list_id/todo_items(.:format)  todo_items#create
new_todo_list_todo_item_path    GET /todo_lists/:todo_list_id/todo_items/new(.:format)  todo_items#new
edit_todo_list_todo_item_path   GET /todo_lists/:todo_list_id/todo_items/:id/edit(.:format) todo_items#edit
todo_list_todo_item_path    GET /todo_lists/:todo_list_id/todo_items/:id(.:format)  todo_items#show
PATCH   /todo_lists/:todo_list_id/todo_items/:id(.:format)  todo_items#update
PUT /todo_lists/:todo_list_id/todo_items/:id(.:format)  todo_items#update
DELETE  /todo_lists/:todo_list_id/todo_items/:id(.:format)  todo_items#destroy
todo_lists_path GET /todo_lists(.:format)   todo_lists#index
POST    /todo_lists(.:format)   todo_lists#create
new_todo_list_path  GET /todo_lists/new(.:format)   todo_lists#new
edit_todo_list_path GET /todo_lists/:id/edit(.:format)  todo_lists#edit
todo_list_path  GET /todo_lists/:id(.:format)   todo_lists#show
PATCH   /todo_lists/:id(.:format)   todo_lists#update
PUT /todo_lists/:id(.:format)   todo_lists#update
DELETE  /todo_lists/:id(.:format)   todo_lists#destroy
root_path   GET /   todo_lists#index
Request

Parameters:

None
Toggle session dump
Toggle env dump
Response

Headers:

None
x
>>   

here is my route.rb file:

Rails.application.routes.draw do

  resources :todo_lists do 
    resources :todo_items do
      member do
        patch :complete
      end
    end
  end
  root 'todo_lists#index'
  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root 'welcome#index'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route with concerns:
  #   concern :toggleable do
  #     post 'toggle'
  #   end
  #   resources :posts, concerns: :toggleable
  #   resources :photos, concerns: :toggleable

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end

here is my complete_spec.rb file:

require 'spec_helper'

describe "Completing todo items" do
    let!(:todo_list) { TodoList.create(title: "Grocery List", description: "Groceries") }
    let!(:todo_item) { todo_list.todo_items.create(content: "Milk") }

    it "is successful whem marking a single item complete" do
        expect(todo_item.completed_at).to be_nil
        visit_todo_list todo_list
        within dom_id_for(todo_item) do
            click_link "Mark Complete"
        end
        todo_item.reload
        expect(todo_item.completed_at).to_not be_nil
    end
end

here is my index.html.erb file:

<h1><%= @todo_list.title %></h1>

<table class="todo_items">
    <% @todo_list.todo_items.each do |todo_item| %>
    <tr id="<%= dom_id(todo_item) %>">
        <td><%= todo_item.content %></td>
        <td>
            <%= link_to "Mark Complete", complete_todo_list_todo_item_path(todo_item), method: :patch %>
            <%= link_to "Edit", edit_todo_list_todo_item_path(todo_item) %>
            <%= button_to "Destroy", todo_list_todo_item_path(todo_item), method: :delete, data: { confirm: "Are you sure?" } %>
        </td>
    </tr>
    <% end %>
</table>

<p>
    <%= link_to "New Todo Item", new_todo_list_todo_item_path %>
</p>

and here is the complete controller in my todo_items_controller.rb file:

def complete
    @todo_item = @todo_list.todo_items.find(params[:id])
    @todo_item.update_attribute(:completed_at, Time.now)
    redirect_to todo_list_todo_items_path, notice: "Todo item marked as complete."
  end

Any idea what could be happening? FYI: i'm on windows 10 pro, using Rails 4.2.5, on a Dell xps 9550 laptop.