Daniel Gomez Firmat
Daniel Gomez Firmat

Reputation: 43

ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"projects"} missing required keys: [:id]

This is the error I'm getting (see below)

ProjectsControllerTest#test_should_redirect_create_when_not_logged_in:
ActionController::UrlGenerationError: No route matches{:action=>"show", :controller=>"projects"} missing required keys: [:id]
test/controllers/projects_controller_test.rb:11:in `block (2 levels) in <class:ProjectsControllerTest>'
test/controllers/projects_controller_test.rb:10:in `block in <class:ProjectsControllerTest>'

I'm quite new to Ruby on Rails, however I've been looking around and trying different things with no joy. I know that the project :id is not being sent but I cannot figure out why

Routes.rb

Rails.application.routes.draw do

 get 'password_resets/new'
 get 'password_resets/edit'
 get 'sessions/new'
 get 'users/new'

 root 'static_pages#home'
 get  '/help',    to: 'static_pages#help'
 get  '/about',   to: 'static_pages#about'
 get  '/contact', to: 'static_pages#contact'
 get  '/signup',  to: 'users#new'
 get    '/login',   to: 'sessions#new'
 post   '/login',   to: 'sessions#create'
 delete '/logout',  to: 'sessions#destroy'
    resources :users do

member do
  get :following, :followers
end
 end
  resources :users
  resources :account_activation, only: [:edit]
  resources :password_resets,    only: [:new, :create, :edit, :update]
  resources :microposts,         only: [:create, :destroy]
  resources :relationships,      only: [:create, :destroy]
  resources :projects
end

Project.model.rb

class Project < ApplicationRecord
  before_save {name.downcase!}
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :name && :category, presence: true
  validates :name, presence: true, 
                     uniqueness: { case_sensitive: false }

Projects_controller.rb

class ProjectsController < ApplicationController
before_action :logged_in_user, only: [:index, :show, :create]
before_action :project_owner,   only: :destroy

def index
end

def show
    @project = Project.find(params[:id])
end

def new
    @project = Project.new
end

def create
    @project = current_user.projects.build(project_params)
    if @project.save
        flash[:success] = "Project Created"
        redirect_to @project
    else
      render 'new'
    end
end

def destroy
    @project.destroy
    flash[:success] = "Project Deleted"
    redirect_to request.referrer || root_url
  end

private

def project_params
    params.require(:project).permit(:name,:category,:picture)
end

def project_owner
      @project = current_user.projects.find_by(id: params[:id])
      redirect_to root_url if project.nil?
end
end

and finally this is the test suit I'm running

projects_controller_test.rb

require 'test_helper'

class ProjectsControllerTest < ActionDispatch::IntegrationTest

   def setup
    @project = projects(:Charity)
  end

  test "should redirect create when not logged in" do
    assert_no_difference 'Project.count' do
      post project_path, params: { project: {name:  "  ",
                                         category: "  " } }
    end
    assert_redirected_to login_url
  end

Thanks in advance!

--- Edit 1 ----

       projects GET    /projects(.:format)                    projects#index
                POST   /projects(.:format)                    projects#create
    new_project GET    /projects/new(.:format)                projects#new
   edit_project GET    /projects/:id/edit(.:format)           projects#edit
        project GET    /projects/:id(.:format)                projects#show
                PATCH  /projects/:id(.:format)                projects#update
                PUT    /projects/:id(.:format)                projects#update
                DELETE /projects/:id(.:format)                projects#destroy

Upvotes: 2

Views: 2388

Answers (1)

max pleaner
max pleaner

Reputation: 26788

The error is coming from here:

  post project_path, params: { project: {name:  "  ",
                                     category: "  " } }

You need to pass an id attribute in the project hash

This is because you are using the standard show route generated by resources which required an id.

Upvotes: 1

Related Questions