2012-03-17 19 views
6

Mam naprawdę prosty problem. Mam stronę raportów i każdy raport ma własną kartę. Używam current_page? do określenia, która karta powinna być podświetlona. Kiedy przesyłam raport, current_page? nie wydaje się już działać, najwyraźniej dlatego, że metoda żądania to POST.Rails current_page? "zawiedzie", gdy metoda jest POST

Czy to jest zamierzone zachowanie current_page? Trudno mi sobie wyobrazić, dlaczego tak się stało. Jeśli tak, to jak ludzie normalnie ominą ten problem?

Oto przykład current_page? rozmowy:

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

+1

można dodać błąd na pytanie, w tym jak używasz CURRENT_PAGE:

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 

Teraz można to zrobić ? – AMIT

+0

Edytuję moje pytanie w celu uwzględnienia mojego wywołania 'current_page?'. Nie dostaję błędu. Po prostu zwraca wartość false. –

Odpowiedz

9

Dobra, wygląda na to, że zorientowali się odpowiedź na moje pytanie, około 5 minut po rozklejanie bounty. Wygląda na to, że current_page? zawsze zwróci false na POST.

Oto kod źródłowy 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 

ja naprawdę nie rozumiem dlaczego oni poszli na ich drodze, aby current_page? pracy tylko dla GET wniosków, ale przynajmniej teraz wiem, że to tak to wygląda.

+0

Prawdopodobnie powinieneś zaakceptować swoją odpowiedź i usunąć nagrodę. –

+0

Nie mogę tego jeszcze zrobić, ponieważ, jak widzisz, odpowiedziałem na to pytanie zaledwie godzinę temu. –

+4

Jeśli ktoś jeszcze ma tę samą frustrację, którą miałem, znalazłem obejście problemu 'current_page?' "" Tutaj: http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -Nazwa –

0

Wystąpił ten sam problem podczas korzystania z POST. Moje rozwiązanie było zrobić coś takiego

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 

gdzie link_path tylko url_for(action: 'action', controller: 'controller')

2

Można utworzyć nową metodę current_path? w swojej ApplicationHelper:

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

przemieszczać się w jednym lub więcej ścieżek i to zwraca wartość true, jeśli pasuje do bieżącej ścieżki użytkownika:

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

Albo, można utworzyć nową metodę current_request? pomocnika do sprawdzenia kontrolera Rails + PROMOCJA:

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

przemieszczać się w jednym lub więcej sterownikiem + działania i zwraca true, jeśli każdy mecz obecny wniosek autora:

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

== == AKTUALIZACJA

Ok, postanowiłem zrobić używając current_request? trochę mniej gadatliwy przez nie req uiring że wpiszesz się kontroler, gdy próbujesz dopasować kilka czynności:

current_request?(controller: 'users', action: ['new', 'create']) 
Powiązane problemy