/ / Nowy kontroler - brak trasy Dopasowania aktualizują, edytują, pokazują lub niszczą - ruby-on-rails

Nowy kontroler - bez tras Dopasuj, edytuj, pokaż lub zniszcz - ruby-on-rails

Mam pewne trudności z poprawnym ustawieniem wszystkich tras RESTful. Dotychczas wykonałem najprostsze proste kroki w mojej aplikacji.

  1. Utwórz nową aplikację do szyn
  2. Utwórz nowy kontroler za pomocą akcji RESTful
  3. Dodaj resources do routes.rb

A jednak 4 z moich 7 działań nie spełniają testów domyślnych. Czy ktoś może wyjaśnić dlaczego?

rails generate controller Employees new create update edit destroy index show

A oto odpowiedni kontroler, employees_controller.rb

class EmployeesController < ApplicationController
def new
end

def create
end

def update
end

def edit
end

def destroy
end

def index
end

def show
end
end

Teraz dodam zasoby do routes.rb

Rails.application.routes.draw do

resources :employees

end

Wszystkie trasy wydają się być tam, w oparciu o wyjście rake routes

       Prefix Verb   URI Pattern                   Controller#Action
employees GET    /employees(.:format)          employees#index
POST   /employees(.:format)          employees#create
new_employee GET    /employees/new(.:format)      employees#new
edit_employee GET    /employees/:id/edit(.:format) employees#edit
employee GET    /employees/:id(.:format)      employees#show
PATCH  /employees/:id(.:format)      employees#update
PUT    /employees/:id(.:format)      employees#update
DELETE /employees/:id(.:format)      employees#destroy

Ale teraz, gdy uruchamiam testy domyślne, otrzymuję 4 błędy:

# Running:

.EEEE..

Finished in 0.267712s, 26.1475 runs/s, 11.2061 assertions/s.

1) Error:
EmployeesControllerTest#test_should_get_update:
ActionController::UrlGenerationError: No route matches {:action=>"update",       :controller=>"employees"}
test/controllers/employees_controller_test.rb:15:in `block in   <class:EmployeesControllerTest>"


2) Error:
EmployeesControllerTest#test_should_get_destroy:
ActionController::UrlGenerationError: No route matches {:action=>"destroy", :controller=>"employees"}
test/controllers/employees_controller_test.rb:25:in `block in <class:EmployeesControllerTest>"


3) Error:
EmployeesControllerTest#test_should_get_show:
ActionController::UrlGenerationError: No route matches {:action=>"show",     :controller=>"employees"}
test/controllers/employees_controller_test.rb:35:in `block in <class:EmployeesControllerTest>"


4) Error:
EmployeesControllerTest#test_should_get_edit:
ActionController::UrlGenerationError: No route matches {:action=>"edit", :controller=>"employees"}
test/controllers/employees_controller_test.rb:20:in `block in <class:EmployeesControllerTest>"

7 runs, 3 assertions, 0 failures, 4 errors, 0 skips

Wreszcie, oto treść employees_controller_test.rb. Jak powiedziałem, są to domyślne testy tworzone automatycznie przez Railsy po wygenerowaniu kontrolera.

require "test_helper"

class EmployeesControllerTest < ActionController::TestCase
test "should get new" do
get :new
assert_response :success
end

test "should get create" do
get :create
assert_response :success
end

test "should get update" do
get :update
assert_response :success
end

test "should get edit" do
get :edit
assert_response :success
end

test "should get destroy" do
get :destroy
assert_response :success
end

test "should get index" do
get :index
assert_response :success
end

test "should get show" do
get :show
assert_response :success
end

end

Odpowiedzi:

0 dla odpowiedzi № 1

zgodnie z odpowiedzią dimakury musisz zmienić niektóre trasy w teście

metoda aktualizacji to a put (lub patch za częściowe zmiany w szynach4)

  test "should get update" do
put :update
assert_response :success
end

a do edycji, usuwania i pokazywania tras, id brakuje

  test "should get edit" do
get :edit, id: 2
assert_response :success
end

0 dla odpowiedzi nr 2

Twój test kontrolera prawdopodobnie wygląda:

class EmployeesControllerTest < ActionController::TestCase
test "should get create" do
get :create
assert_response :success
end

# other tests not shown

koniec

Powinieneś to zmienić na:

class EmployeesControllerTest < ActionController::TestCase
test "should get create" do
post :create
assert_response :success
end

# other tests should be changed accordingly
end

Posługiwać się patch lub put metoda dla update, i delete dla delete działania.