为啥 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点?

Posted

技术标签:

【中文标题】为啥 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点?【英文标题】:Why did Ruby on Rails' URL Helper put a period in my URL?为什么 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点? 【发布时间】:2014-05-12 13:28:07 【问题描述】:

我认为有以下代码(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) 

创建一个如下所示的 URL:

order_submissions.533ab7337764690d6d000000

我希望它是

order_submissions/533ab7337764690d6d000000

那个时期是从哪里来的?

这是我的路线:

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

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

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

(.:format) 可能是什么搞砸了,但我不知道为什么。我只是希望它在那里放一个斜线。

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

 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'

【问题讨论】:

【参考方案1】:

order_submissions_path(复数)指向/order_submissions。它有两个参数,第一个是请求的格式(例如 html)。您的 ID 正在为此参数传递,从而导致您看到的结果 URL。

您实际上需要单数路径帮助器 order_submission_path,它接受 ID 作为第一个参数。

【讨论】:

噢……我明白了。从复数到单数的变化奏效了。所以基本上我有两条不同的路径: order_submissions_path - 这是用于处理整个对象集合的 CRUD 路由 order_submission_path - 这是用于处理单个对象的 CRUD 路由 听起来对吗?顺便说一句,order_submissions_path 和 order_submissions_url 有什么区别? @user2760030 有许多路由助手,它比您在此处所说的更细微,但您明白了。您应该查看Rails Guide on Routing 以获得更深入的描述。【参考方案2】:

因为它应该是单数形式:

order_submission_path(order_submission.id) 

没有

order_submissions_path(order_submission.id)

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

更新:

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

【讨论】:

我正在学习 RoR,目前我没有使用 resources :order_submissions 但我还是尝试了它,它给了我相同的结果。 你能粘贴你的路由文件吗?这个 url helper 必须在某个地方创建。【参考方案3】:

默认情况下,您不会获得命名路由。例如,您从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) 将起作用。 (注意:如果您的order_submission 响应to_path 并返回id,则.id 是多余的。)

我猜您的rake routes 输出中有另一条路线使用您提供的命名路线并且不使用/:id。也许你的索引路线?

【讨论】:

我的印象是我不需要为 RESTful 路由的“显示”部分定义命名路由?路线:code 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' delete 'order_submissions/:id' => 'order_submissions#destroy' 呸,我已将我的整个路线添加到 OP。 如果您想使用命名路由来生成 url,您可以这样做。您可以通过运行bundle exec rake routes | grep order_submission 看到没有为您自动生成的命名路由:show 路由。不过,您最好不要这样做?我只是做resources :order_submissions,而不是像您似乎正在做的那样手动定义 7 条路线。

以上是关于为啥 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Ruby on Rails 不使用 .includes() 加载我的关联对象?

Ruby on Rails 表单中的枚举选择映射值

为啥我的链接不适用于我的 ruby​​ on rails 网站?单击时链接保持在同一页面上

使用Ruby On Rails生成URL(url_for)

Ruby on Rails URL 格式

Ruby on rails 参数出现在 url