2012-03-17 15 views
6

Ho un problema davvero semplice. Ho una pagina di rapporti e ogni rapporto ha la sua scheda. Sto usando current_page? per determinare quale scheda deve essere evidenziata. Quando invio un rapporto, current_page? sembra non funzionare più, apparentemente perché il metodo di richiesta è POST.Rails current_page? "fallisce" quando il metodo è POST

È questo il comportamento previsto di current_page? Ho difficoltà a immaginare perché sarebbe il caso. Se lo è, come fanno le persone a ovviare a questo problema?

Ecco un esempio di una chiamata current_page?:

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

+1

si può aggiungere l'errore alla tua domanda, compreso il modo in uso CURRENT_PAGE ? – AMIT

+0

Ho modificato la mia domanda per includere la mia chiamata 'current_page?'. Non sto ottenendo un errore. Restituisce semplicemente falso. –

risposta

9

Va bene, sembra che ho capito la risposta alla mia domanda circa 5 minuti dopo aver messo una taglia. Sembra che current_page? restituisca sempre false su POST.

Ecco il codice sorgente per 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 

io non capisco il motivo per cui sarebbero andati fuori del loro modo di fare current_page? lavoro solo per GET richieste, ma almeno ora so che questo è così com'è.

+0

Probabilmente dovresti accettare la tua risposta e rimuovere la taglia. –

+0

Non posso ancora farlo perché, come puoi vedere, ho risposto alla domanda solo un'ora fa. –

+4

Se qualcun altro ha la stessa frustrazione che ho avuto, ho trovato una soluzione alternativa al 'current_page?' "Problema" qui: http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -nome –

0

Stavo avendo lo stesso problema quando si utilizza POST. La mia soluzione era quella di fare qualcosa di simile

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 

dove link_path è solo url_for(action: 'action', controller: 'controller')

2

Si potrebbe creare un nuovo metodo current_path? nel ApplicationHelper:

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

Passo in uno o più percorsi ed è restituisce true se qualsiasi corrisponde al percorso corrente dell'utente:

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

In alternativa, è possibile creare un nuovo metodo current_request? di supporto per controllare il controller Rails + azione:

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

Passo in uno o più controller + azione e restituisce true se ogni partita richiesta di corrente dell'utente:

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

== AGGIORNAMENTO ==

Ok, ho deciso di fare utilizzando current_request? un po 'meno prolissa da non req uiring che si digita il controllore quando si sta cercando di abbinare più azioni:

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 

Ora si può fare questo:

current_request?(controller: 'users', action: ['new', 'create']) 
Problemi correlati