У меня есть модель, которая отвечает за управление путями к ресурсам. Если возможно, я хотел бы использовать несколько помощников по маршрутизации Rails. Я не хочу делать никаких предположений о типе ресурса, которым управляют, поскольку я хотел бы, чтобы это было общим.

http://edgeguides.rubyonrails.org/routing.html # create-paths-and-urls-from-objects заявляет, что «Вы также можете использовать url_for с набором объектов, и Rails автоматически определит, какой маршрут вам нужен:»

<%= link_to 'Ad details', url_for([@magazine, @ad]) %>

Из того, что я обнаружил, помощники url_for обычно ожидают хеша, который включает контроллер, действие и т. Д. То, что я искал, - это то, что, по-видимому, возвращает вышеуказанный url_for, то есть путь к ресурсу из массива объектов. Я не уверен, что использую просто неправильное пространство имен, но просматривая документы API, я не могу найти пространство имен, которое предоставило бы вышеуказанный метод.

Чтобы уточнить, я пытаюсь сделать что-то подобное в модели:

resource_array = [parent_resource, child_resource]
resource_path = url_for(resource_array)

Обычно я оставляю любой код маршрутизации вне класса модели, но этот класс предназначен для управления путями к ресурсам. Заранее спасибо.

Изменить: Это синтаксис, который я в итоге использовал:

Rails.application.routes.url_helpers.polymorphic_path(resource)

Изменить (2): Я чувствую, что должен быть лучший способ сделать это, но это то, что у меня есть прямо сейчас.

resource_path = ''
resource_array.each do |resource|
  resource_path += '/' + resource.class.name.pluralize.underscore + '/' + resource.id.to_s
end
1
Joey 3 Янв 2014 в 21:14

1 ответ

Лучший ответ

Я не уверен, что это именно то, что вы просите, но url_for - это метод экземпляра модуля ActionDispatch::Routing::UrlFor, поэтому вам нужно extend или include этот модуль чтобы получить доступ к методу.

0
Peter Alfvin 3 Янв 2014 в 21:27
В итоге я использовал polymorphic_path. Я поклялся, что пробовал описанное выше (редактировать вопрос). синтаксис на днях, но, похоже, он работает так, как я хотел. Я нашел документацию по вашему предложению, поэтому спасибо, что нашли время ответить :)
 – 
Joey
7 Янв 2014 в 05:03
На самом деле я забыл, что хотел, чтобы это работало с вложенными ресурсами. Я мог бы просто построить путь к ресурсам вручную.
 – 
Joey
7 Янв 2014 в 05:10