在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
中的收集路由?
答案 0 :(得分:2)
您调用转移操作的方式看起来您没有传递任何ID。成员路由始终处理ID(即在特定成员上),并且集合适用于多个对象。
e.g。 edit,show等方法是成员方法的示例,因为它们接受对象的ID并处理特定对象。而索引之类的方法是收集方法的例子