Как получить ключи сегмента от маршрута Rails 3? - PullRequest
2 голосов
/ 14 апреля 2011

Мне нужно определить количество ключей сегмента маршрута в текущем пути для приложения, над которым я работаю, и, несмотря на некоторое копание в связанных исходных файлах Rails 3, я не могу понять это.

Я знаю, как использовать url_for и request, чтобы построить путь из текущего маршрута, но я не знаю, как на самом деле добраться до ActionController::Routing::Route, который отображается на маршрут url_for.с помощью.Если я могу получить экземпляр нужного мне маршрута, я могу просто вызвать Route # сегмент_ключей и получить то, что мне нужно.

Если кому-то интересно, я делаю это потому, что могу переключаться между ресурсамис раскрывающимся списком и остаться в текущем представлении, которое применяется к выбранному в данный момент ресурсу, но , только если текущий путь не содержит вложенных путей (т. е. переключение с /resources/1/edit на /resources/2/edit, но не переключайтесь между /resources/1/subresources/1 на /resources/2/subresources/1, потому что subresource номер 1 не является потомком resource 2).

Ответы [ 3 ]

0 голосов
/ 08 октября 2012

Вам нужны все ключи сегмента или просто определенный вид?

Я смог получить только буквальные ключи с этим кодом

Rails.application.routes.routes.collect do |i|
  i.path.spec.grep(Journey::Nodes::Literal).collect(&:left)
end

Это дало мне только массивлитеральных сегментов - могу поспорить, что вы можете изменить это для подсчета количества существующих ключей сегментов (или сделать это один раз для литералов и один раз для символов) Journey::Nodes::Cat поддерживает to_s, что даст вам исходную строку, использованную для построенияroute и to_regexp, который даст вам регулярное выражение, с которым вы можете работать request.path

0 голосов
/ 06 апреля 2015

Хотелось бы что-нибудь подобное? Разрешает путь к хешу маршрута.

> uri = URI("http://localhost:3000/items/2015/3") # some URI for your request, or the URL/Path in question
> Rails.application.routes.recognize_path(uri.path)
=> {:controller=>"items", :action=>"index", :year=>"2015", :month=>"03"}
0 голосов
/ 15 декабря 2011

У меня был случай, когда мне нужно сделать что-то подобное, поэтому я добавил метод в мой application_helper.rb:

def display_sub_navigation
  if admin_signed_in?
    url_path = request.fullpath.split("/")
    if url_path.size > 3 && File.exists?( Rails.root.join("app/views/shared/_#{url_path[2]}_sub_navigation.html.erb") )
      render :partial => "/shared/#{url_path[2]}_sub_navigation"
    end
  end
end

Как вы можете видеть, использование request.fullpath.split ("/") создает массив, который я назначаю url_path. Отсюда я могу извлечь то, что я хочу, или посчитать количество элементов в массиве. Я надеюсь, что это подтолкнет вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...