2015-10-27 4 views
1

Я получаю ActionController :: UrlGenerationError: нет совпадений маршрутов (: action => "edit",: controller => "goals"), когда Я пытаюсь проверить контроллер целейActionController :: UrlGenerationError: при попытке тестирования контроллера нет совпадений маршрутов

Вот мой goals_controller_test.rb

require 'test_helper' 

class GoalsControllerTest < ActionController::TestCase 
    test "should be redirected when not logged in" do 
    get :new 
    assert_response :redirect 
    assert_redirected_to new_user_session_path 
    end 

    test "should render the new page when logged in" do 
    sign_in users(:guillermo) 
    get :new 
    assert_response :success 
    end 

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

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

Это мой routes.rb

Rails.application.routes.draw do 
    devise_for :users 

    authenticated :user do 
    root 'du#dashboard', as: "authenticated_root" 
    end 

    resources :goals 

    root 'du#Home' 

end 

Мой goals_controller.rb

class GoalsController < ApplicationController 
    before_filter :authenticate_user!, only: [:new] 

    def new 
    end 

    def edit 
    end 

    def show 
    end 

    private 

    def find_user 
    @user = User.find(params[:user_id]) 
    end 

    def find_goal 
    @goal = Goal.find(params[:id]) 
    end 
end 

Я нахожу это странным, что, если я использую получить «целей/редактировать» вместо ресурсов: Цели тест пройден.

Большое спасибо за любые рекомендации.

ответ

6

При использовании resources :goals Rails генерирует для вас следующие маршруты (RESTful):

goals GET /goals(.:format)   goals#index 
      POST /goals(.:format)   goals#create 
new_goal GET /goals/new(.:format)  goals#new 
edit_goal GET /goals/:id/edit(.:format) goals#edit 
    goal GET /goals/:id(.:format)  goals#show 
      PATCH /goals/:id(.:format)  goals#update 
      PUT /goals/:id(.:format)  goals#update 
      DELETE /goals/:id(.:format)  goals#destroy 

Как вы можете видеть, ударить edit action /goals/:id/edit необходимо передать :id. Таким образом, в вашем контроллере вы сможете найти запись по заданному :id =>Goal.find(params[:id]). Так, в тестах вы должны пройти этот :id, что-то вроде:

get :edit, id: 1 # mapping to /goals/1/edit 

Если вручную добавить этот маршрут get 'goals/edit', он работает, потому что карты непосредственно /goals/edit (Примечание нет :id).

Btw, рекомендую ознакомиться с официальными руководствами по маршрутизации: http://guides.rubyonrails.org/routing.html

2
@goal = Goal.create(your params here) or use factory girl gem or fixtures 

вы должны передать идентификатор get :edit ,id: @goal

useful article

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