Почему помощник по URL в Ruby on Rails поместил точку в мой URL?

У меня есть следующий код на мой взгляд (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 

успешно отображается как идентификационный номер (533ab7337764690d6d000000)

Но...

order_submissions_path(order_submission.id) 

Создает URL, который выглядит как:

order_submissions.533ab7337764690d6d000000

Я хочу чтобы это было

order_submissions/533ab7337764690d6d000000

Откуда взялся этот период?

Это мой маршрут:

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

И когда я запускаю рейковые маршруты, я получаю:

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 ответа

Решение

order_submissions_path (множественное число) указывает на /order_submissions, Он принимает два аргумента, первый из которых является форматом запроса (например, html). Ваш идентификатор передается для этого аргумента, что приводит к полученному URL-адресу.

Вы на самом деле хотите единственного помощника пути, order_submission_path, который принимает идентификатор в качестве первого аргумента.

Потому что это должна быть форма единственного числа:

order_submission_path(order_submission.id) 

Не

order_submissions_path(order_submission.id)

order_submissions_path указывает на действие индекса. Вы также можете удалить id с конца.

ОБНОВИТЬ:

Просто обратите внимание на ваш файл маршрута. У вас есть какие-либо ресурсы, определенные там? Маршрут, который вы опубликовали, не будет генерировать url_helper, так как вы не указали имя маршрута (скорее всего, эта запись устарела, так как я ожидаю, что есть resources :order_submissions где-то там тоже).

Вы не получаете именованный маршрут по умолчанию. Маршрут, с которого вы показали 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, Возможно, ваш индекс маршрута?

Другие вопросы по тегам