为什么Ruby on Rails的URL Helper在我的URL中放了一段时间?

时间:2014-04-01 16:25:45

标签: ruby-on-rails ruby routes url-helper

我在视图中有以下代码(RoR 4):

tbody
  - @order_submissions.each do |order_submission|
    tr
      td = order_submission.id
      td.table-actions
        span = link_to "Show", order_submissions_path(order_submission.id)

td = order_submission.id 

成功显示为ID号(533ab7337764690d6d000000)

但是...

order_submissions_path(order_submission.id) 

创建一个以:

形式出现的网址
order_submissions.533ab7337764690d6d000000

我希望它是

order_submissions/533ab7337764690d6d000000

那个时期来自哪里?

这是我的路线:

get 'order_submissions/:id'         => 'order_submissions#show'

当我运行rake路线时,我得到:

GET    /order_submissions/:id(.:format)        order_submissions#show

(。:格式)可能会搞砸它,但我不知道为什么。我只是想让它在那里放一个斜线。

如果我将我的代码更改为此修复它:

 span = link_to "Show", order_submissions_path + '/' + order_submission.id

但那是一个非常非常愚蠢的解决方法。

编辑:这是我的路线:

   get 'order_submissions'             => 'order_submissions#index'
   get 'order_submissions/new'         => 'order_submissions#new'
   post 'order_submissions'            => 'order_submissions#create'
   get 'order_submissions/:id'         => 'order_submissions#show'
   get 'order_submissions/:id/edit'    => 'order_submissions#edit'
   patch 'order_submissions/:id'       => 'order_submissions#update'
   get 'order_submissions/:id/delete'  => 'order_submissions#delete'
   delete 'order_submissions/:id'      => 'order_submissions#destroy'

3 个答案:

答案 0 :(得分:6)

order_submissions_path(复数)指向/order_submissions。它需要两个参数,第一个是请求的格式(例如html)。您的ID将被传入此参数,从而导致您看到的结果URL。

你真的想要一个单一的路径助手order_submission_path,它接受​​一个I​​D作为第一个参数。

答案 1 :(得分:2)

因为它应该是单数形式:

order_submission_path(order_submission.id) 

order_submissions_path(order_submission.id)

order_submissions_path指向索引操作。您也可以从最后删除id

更新:

注意你的路线文件。你有资源吗?您发布的路由不会生成任何url_helper,因为您没有指定路由名称(很可能这个条目已过时,因为我预计那里也有resources :order_submissions

答案 2 :(得分:1)

默认情况下,您没有获得指定路线。例如,您从rake routes显示的路线并未列出命名路线。

GET /order_submissions/:id(.:format) order_submissions#show

通常情况下,您会在GET前面看到指定的路线。

所以你可以自己定义,然后你的路线就可以了:

get 'order_submissions/:id' => 'order_submissions#show', as: :order_submission

注意as: :order_submission位。现在,order_submission_path(order_submission.id)将起作用。 (注意:如果.id回复order_submission并返回to_path,则id是多余的。)

我猜你在rake routes输出中有另一条路线,它使用你提供的指定路线并且不使用/:id。也许你的指数路线?