为什么成员路由导致ActionController :: UrlGenerationError

时间:2015-12-10 06:11:00

标签: ruby-on-rails rspec

action控制器中定义transfer transactions(Rails 4.2)。行动transfer类似于new,为用户填写表单transfer.html.erb以填充和保存:

def transfer
  @title = t('Account Transfer')
  @transaction = BankAccountx::Transaction.new()
end

在routes.rb中,定义路线:

  resources :transactions do
    member do
      get :transfer
      patch :transfer_result
    end 
  end  

以下是规范:

it "should render transfer" do
    session[:user_id] = @u.id
    get 'transfer'
    expect(response).to be_success
end

在rspec中,有错误:

ActionController::UrlGenerationError:
       No route matches {:action=>"transfer", :controller=>"bank_accountx/transactions"} 

以下是规范:

routes {BankAccountx::Engine.routes}

如果我们在routes.rb中使用collection而不是member,那么上面的rspec就会通过。以下路线有效:

 resources :transactions do
    collection do
      get :transfer
      patch :transfer_result
    end 
 end  

为什么此成员操作transfer需要routes.rb中的收集路由?

1 个答案:

答案 0 :(得分:2)

您调用转移操作的方式看起来您没有传递任何ID。成员路由始终处理ID(即在特定成员上),并且集合适用于多个对象。

e.g。 edit,show等方法是成员方法的示例,因为它们接受对象的ID并处理特定对象。而索引之类的方法是收集方法的例子