2016-11-24 110 views
1

這是我得到的錯誤(見下文)ActionController :: UrlGenerationError:沒有路由匹配{:action =>「show」,:controller =>「projects」}缺少必需的鍵:[:id]

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>' 

我是Ruby on Rails的新手,但是我一直在四處尋找,嘗試不同的東西,沒有快樂。我知道這個項目:ID沒有被髮送,但我想不出爲什麼

的routes.rb

Rails.application.routes.draw做

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 

終於這是測試服我跑

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 

提前感謝!

---編輯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 
+1

通過運行'rake routes'來檢查你的路線。從你的測試錯誤判斷,它看起來你並沒有調用正確的路徑。您的測試指定了創建路徑,但您正在調用您的顯示路徑。 –

+1

project_path返回到特定項目的路徑,因此該項目的id是必需的(例如project_path,{id:@project.id,project:{name .....}}) 問題是,你真的想要改用projects_path。 (用於創建新項目並且不需要任何ID) – sammygadd

+0

您是否擁有該視圖模板? (在app/views/projects/new.html.erb中) – sammygadd

回答

0

的錯誤是從這裏來的:

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

您需要在項目中的散列

這傳遞一個id屬性是因爲您正在使用由需要id的資源生成的標準show route。

相關問題