2016-11-24 4 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, однако я искал вокруг и пробовал разные вещи без радости. Я знаю, что проект: идентификатор не отправляется, но я не могу понять, почему

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 

Спасибо заранее!

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

Проверьте свои маршруты, выполнив 'rake routes'. Судя по вашей тестовой ошибке, мне кажется, что вы не называете правильный путь. Ваш тест указывает путь создания, но вы вызываете свой путь к шоу. –

+1

project_path возвращает путь к определенному проекту, поэтому требуется идентификатор этого проекта (например, project_path, {id: @ project.id, project: {name .....}}) Проблема в том, что вы действительно Вместо этого вы хотите использовать project_path. (Который используется для создания новых проектов и не требует идентификатора) – sammygadd

+0

У вас есть этот шаблон представления? (В приложении/views/projects/new.html.erb) – sammygadd

ответ

0

Ошибка приходит отсюда:

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

Вам нужно передать идентификатор атрибута в хэш-проекта

Этот потому что вы используете стандартный маршрут шоу, генерируемый ресурсами, для которых требуется идентификатор.

Смежные вопросы

 Смежные вопросы