【问题标题】:Why member route causes ActionController::UrlGenerationError为什么成员路由会导致 ActionController::UrlGenerationError
【发布时间】:2016-03-15 16:12:52
【问题描述】:

transactions 控制器(Rails 4.2)中定义了一个action transfer。操作transfernew 类似,通过弹出一个表单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 中的收集路由?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

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

    例如像edit、show这样的方法是成员方法的例子,因为它们接受对象的ID并作用于特定的对象。而 index 之类的方法是收集方法的示例

    【讨论】:

    • transfer 就像new 一样,提供一个表格transfer.html.erb 供用户填写和保存。所以没有id 可以传入,这可能是错误的原因。 Rails 是否将默认 new 视为收集路由?
    • 这是一篇关于会员和收藏的有趣帖子。 new/create 似乎是一个收集动作:stackoverflow.com/questions/3028653/…
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2019-05-25
    • 2016-04-29
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多