2015-10-07 4 views
0

Я пытаюсь выполнить базовое тестирование своего приложения.Нет совпадений маршрутов {: action => "create",: controller => "transaction"}

У меня есть контроллер transaction_controller.rb с помощью метода 'create'. Вот мои маршруты:

root GET/      home#index 
     PUT /transaction/:id(.:format) transactions#create 
     GET /transaction/:id(.:format) transactions#show 
     GET /types/:type(.:format)  transactions#types 
     GET /sum/:id(.:format)   transactions#sum 

Вот код внутри transactions_controller_test.rb метода испытаний:

test "should create new transaction" do 
    put :create, { amount: 7000, type: "cars", parent_id: 2 } 
    assert_response(:success, message = '{ "status": "ok" }') 
    end 

И это дает следующее сообщение об ошибке, если я запускаю тест грабли:

ActionController::UrlGenerationError: No route matches {:action=>"create", :controller=>"transactions"} 

Почему если все на месте? Может ли кто-нибудь помочь мне?

+1

Уточнить вопрос с помощью кода 'routes.rb'? – Pavan

ответ

0

Ошибка в routes.rb

PUT /transaction/:id(.:format) transactions#create 

Должно быть

POST /transactions(.:format) transactions#create 

Ваш маршрут маршрут сделки # обновления (PUT запрос с идентификатором парам). Это должно выглядеть примерно так:

resources :transactions, only: [:show, :create] 
+0

Вы не должны использовать PUT для создания ресурса. Его 5-я заповедь :) – max

+0

Typo. POST, чтобы создать, конечно. –

1

Вы должны использовать POST not PUT to create a resource. В Rails и REST в общем случае действие PATCH или PUT используется для обновления существующего ресурса. PUT, как правило, обесценивался в более поздних версиях Rails, если предпочтение PATCH объясняется семантикой определений глаголов HTTP. В коротком использовании PATCH не PUT.

Изменить определение маршрута к:

resources :transactions, only: [:show, :create, :update] 

Это изменит свои маршруты на:

GET /transactions, transactions#index 
POST /transactions, transactions#create 
PATCH /transactions/:id, transactions#update 

и ваши изменения теста использовать правильный HTTP глагол:

test "should create new transaction" do 
    post :create, { amount: 7000, type: "cars", parent_id: 2 } 
    assert_response(:success, message = '{ "status": "ok" }') 
end 

Кроме того, вы должны рассмотреть более спокойный шаблон для ваших дополнительных маршрутов:

resources :transactions, only: [:show, :create] do 
    collection do 
    get :sum # /transactions/sum or the sum of all transactions. 
    end 
end 

Его немного неясно, что /type делает, но если он показывает транзакции каждого типа вы можете использовать из параметров запроса с индексом действия вместо:

# GET /transactions?type=car 
def index 
    @transactions = Transaction.all 
    @transactions = @transactions.where(type: params[:type]) if params[:type] 
end 

Кроме того, вы можете захотеть следовать соглашениям рельсы для параметров:

post :create, { transaction: { amount: 7000, type: "cars", parent_id: 2 } } 

Это вложенности может показаться глупым на первый, но это позволяет использовать Rails form helpers и сильные параметры правильно.

-1

На маршруте, когда вы говорите «PUT/transaction /: id (.: Формат) сделки # создать», это означает, что ваша потребность отправить атр идентификатор, то в тесте нужно

положить: создание, {количество: 7000, тип: "автомобили", идентификатор: 2}

или , удалите ID параметра маршрута

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