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

4

当我尝试测试goals控制器时,出现了ActionController :: UrlGenerationError:No route matches(:action =>“edit”,:controller =>“goals”)错误。

这是我的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

我觉得很奇怪,如果我使用 get 'goals/edit' 而不是 resources :goals 测试就能通过。
非常感谢您的任何指导。
2个回答

11

当你使用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

正如您所看到的,要执行编辑操作/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)。

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


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

get :edit ,id: @goal 中,你需要传递id参数。

有用的文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接