没有路线匹配{:action =>“create”,:controller =>“transactions”}

时间:2015-10-07 16:29:40

标签: ruby-on-rails controller tdd testcase

我正在尝试对我的应用程序进行一些基本测试。

我有一个控制器transactions_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

如果我运行rake test,它会产生以下错误:

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

为什么一切都到位了?有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

routes.rb中的错误

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

应该是

POST  /transactions(.:format) transactions#create

您的路线是交易路线#update(带有身份参数的PUT请求)。 它应该看起来像:

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

答案 1 :(得分:1)

您应该使用POST not PUT to create a resource。在Rails和REST中,PATCHPUT操作通常用于更新现有资源。由于HTTP动词定义的语义,如果支持PATCH,PUT在以后的Rails版本中通常会被折旧。简而言之 - 使用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

此外,您可能需要遵循参数的rails约定:

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

这种嵌套最初可能看起来很傻,但它允许您正确使用Rails form helpers和强参数。

答案 2 :(得分:-1)

在路线中,当您说' PUT /transaction/:id(.:format)交易#create'时,这意味着您需要发送attr id,然后在您的测试需要

put:create,{amount:7000,type:" cars",id:2}

或删除路径的params id