【问题标题】: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'

【问题讨论】:

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


    【解决方案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 条路线。
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2014-06-21
    • 2015-03-31
    • 2012-11-07
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多