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
通過運行'rake routes'來檢查你的路線。從你的測試錯誤判斷,它看起來你並沒有調用正確的路徑。您的測試指定了創建路徑,但您正在調用您的顯示路徑。 –
project_path返回到特定項目的路徑,因此該項目的id是必需的(例如project_path,{id:@project.id,project:{name .....}}) 問題是,你真的想要改用projects_path。 (用於創建新項目並且不需要任何ID) – sammygadd
您是否擁有該視圖模板? (在app/views/projects/new.html.erb中) – sammygadd