如何在rails中添加单个自定义路由?

时间:2017-02-26 03:11:49

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller

我有一个'交易'模型,控制器和视图,我用rails生成。现在我需要向我的应用程序添加一个/ transactions / history的自定义路由,由控制器def历史记录处理:... end和render history.html.erb

所以在我的routes.rb中添加了这一行:

get '/transactions/history', to: 'transactions#history', as: 'transactions_history'

这在我的transactions_controller.rb中:

def history
    @transactions = Transaction.all
end

并在transactions-> views

中创建了history.htmk.erb

调用rake路线时我也看到这一行:

transactions_history GET    /transactions/history(.:format)                 transactions#history

但是当我在浏览器中请求localhost:3000 / transactions / history时,它会给我以下错误:

Couldn't find Transaction with 'id'=history

(因为我的控制器中有这一行)

before_action :set_transaction, only: [:show, :edit, :update, :destroy])

我也在日志中看到这一行:

Request info

Request parameters  
{"controller"=>"transactions", "action"=>"show", "id"=>"history"}

我的完整路线: routes.rb 我的完整错误: error logs 为什么要拨打' show'我的交易控制器中的操作?

2 个答案:

答案 0 :(得分:4)

routes.rb中,rails scaffold生成器应添加resources :transactions。这将为您生成7条路线,其中一条为/transactions/:id,与TransactionsController中的展示操作相对应。

Rails按照routes.rb中定义的顺序匹配路由,并将调用第一个匹配路由的控制器操作。

我猜测你在get '/transactions/history', to: 'transactions#history', as: 'transactions_history'以下resources :transactions定义了/transactions/history。当您传递show时,这是:idhistory resources :transactions匹配的resources行动。

要解决此问题,有两种解决方案:

首先,将您的自定义路线移到resources :transactions do collection do get :history end end 之上。

或者扩展NSMutableArray声明并删除自定义路由,如下所示:

NSMutableArray *yourArray = [@[ [@[] mutableCopy]] mutableCopy];

// add an object to the end of your array
[yourArray[section][row] addObject:@(22)];

// set/change an NSNumber object at a particular location in the 2D array.
yourArray[section][row] = @(22);

// Retrieve a value, converting the NSNumber back to a NSInteger
NSInteger result = [yourArray[section][row] integerValue];

答案 1 :(得分:1)

这是因为您的路由与默认资源路由冲突,特别是GET transactions/:id

resources :transactions do
  get :history, on: :collection
end

http://guides.rubyonrails.org/routing.html#adding-collection-routes

您也可以尝试:

  1. 切换路线定义的顺序,或
  2. 更改自定义路线,使其不会发生冲突,例如而不是/transactions/history尝试/transaction_history或其他。