2016-11-24 15 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の新機能ですが、私は見ていて喜びもなく別のものを試しています。 Project.model.rb

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 

の操作を行います。私は、プロジェクトがあることを知っています

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

ビューテンプレートはありますか? (In app/views/projects/new.html.erb) – sammygadd

答えて

0

エラーはここから来ている:

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

あなたは、プロジェクトのハッシュに

これをid属性を渡す必要がありますあなたがIDを必要とするリソースによって生成された標準的なルートを使用しているからです。

関連する問題