ActionController :: UrlGenerationError:尝试测试控制器时没有路由匹配

seq*_*e90 3 ruby ruby-on-rails

我得到一个ActionController :: UrlGenerationError:没有路由匹配(:action =>"edit",:controller =>"目标")错误,当我试图测试目标控制器

这是我的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
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

我的goal_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
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪,如果我使用获取'目标/编辑'而不是资源:测试通过的目标.

非常感谢你的任何指导方针.

mar*_*ets 10

当您使用resources :goalsRails为您生成以下路由(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
Run Code Online (Sandbox Code Playgroud)

如你所见,要点击你需要传递的edit动作.这样,在您的控制器中,您将能够通过给定的=> 找到记录.因此,在您的测试中,您需要传递此信息,例如:/goals/:id/edit:id:idGoal.find(params[:id]):id

get :edit, id: 1 # mapping to /goals/1/edit
Run Code Online (Sandbox Code Playgroud)

如果您手动添加此路由get 'goals/edit',它可以正常工作,因为它直接映射到/goals/edit(注意没有:id).

顺便说一下,我建议你查看官方的路由指南:http://guides.rubyonrails.org/routing.html