Рельсы current_page? "не удается", когда метод POST - PullRequest
7 голосов
/ 17 марта 2012

У меня действительно простая проблема.У меня есть страница отчетов, и у каждого отчета есть своя вкладка.Я использую current_page?, чтобы определить, какая вкладка должна быть выделена.Когда я отправляю какой-либо отчет, current_page?, кажется, больше не работает, по-видимому, потому что метод запроса POST.

Это предполагаемое поведение current_page? Мне трудно представить, почемубыло бы так.Если да, то как люди обычно решают эту проблему?

Вот пример current_page? звонка:

<li><%= link_to "Client Retention", reports_client_retention_path, :class => current_page?(reports_client_retention_path) ? "current" : "" %></li>

Ответы [ 3 ]

11 голосов
/ 19 марта 2012

Хорошо, похоже, я разобрался с ответом на свой вопрос примерно через 5 минут после назначения щедрости.Похоже, current_page? всегда будет возвращать false на POST.

Вот исходный код для current_page?:

# File actionpack/lib/action_view/helpers/url_helper.rb, line 588
def current_page?(options)
  unless request
    raise "You cannot use helpers that need to determine the current "                  "page unless your view context provides a Request object "                  "in a #request method"
  end

  return false unless request.get?

  url_string = url_for(options)

  # We ignore any extra parameters in the request_uri if the
  # submitted url doesn't have any either. This lets the function
  # work with things like ?order=asc
  if url_string.index("?")
    request_uri = request.fullpath
  else
    request_uri = request.path
  end

  if url_string =~ %r^\w+:\/\//
    url_string == "#{request.protocol}#{request.host_with_port}#{request_uri}"
  else
    url_string == request_uri
  end
end

Я действительно не понимаю, почему они пошли быизо всех сил заставить current_page? работать только для GET запросов, но по крайней мере теперь я знаю, что так оно и есть.

2 голосов
/ 19 мая 2014

Вы можете создать новый метод current_path? в вашем ApplicationHelper:

def current_path?(*paths)
  return true if paths.include?(request.path)
  false
end

Передайте один или несколько путей, и он вернет true, если они совпадают с текущим путем пользователя:

current_path?('/user/new')
current_path?(root_path)
current_path?(new_user_path, users_path '/foo/bar')

Или вы можете создать новый вспомогательный метод current_request? для проверки действия контроллера Rails +:

def current_request?(*requests)
  return true if requests.include?({
    controller: controller.controller_name,
    action: controller.action_name
  })
  false
end

Передайте одно или несколько действий контроллер +, и оно вернет истину, если они соответствуют текущему запросу пользователя:

current_request?(controller: 'users', action: 'new')
current_request?({controller: 'users', action: 'new'}, {controller: 'users', action: 'create'})

== UPDATE ==

Хорошо, я решил сделать использование current_request? немного менее многословным, не требуя, чтобы вы вводили контроллер, когда пытаетесь сопоставить несколько действий:

def current_request?(*requests)
  requests.each do |request|
    if request[:controller] == controller.controller_name
      return true if request[:action].is_a?(Array) && request[:action].include?(controller.action_name)
      return true if request[:action] == controller.action_name
    end
  end
  false
end

Теперь вы можете сделать это:

current_request?(controller: 'users', action: ['new', 'create'])
0 голосов
/ 05 декабря 2013

У меня была такая же проблема при использовании POST.Мое решение было сделать что-то вроде этого

def menu_item link_text, link_path
  link_class = (request.original_url.end_with? link_path) ? 'active' : ''
  content_tag :li, link_to(link_text, link_path), class: link_class
end

, где link_path это просто url_for(action: 'action', controller: 'controller')

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