2012-03-17 11 views
6

Tengo un problema realmente simple. Tengo una página de informes y cada informe tiene su propia pestaña. Estoy usando current_page? para determinar qué pestaña debe resaltarse. Cuando envío cualquier informe, current_page? parece que ya no funciona, aparentemente porque el método de solicitud es POST.Rails current_page? "falla" cuando el método es POST

Este es el comportamiento previsto de current_page? Tengo dificultades para imaginar por qué sería ese el caso. Si es así, ¿cómo la gente normalmente soluciona este problema?

He aquí un ejemplo de una llamada current_page?:

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

+1

¿Se puede añadir el error a su pregunta, incluyendo la forma en que está utilizando CURRENT_PAGE ? – AMIT

+0

Edito mi pregunta para incluir mi llamada 'current_page?'. No estoy recibiendo un error. Simplemente devuelve falso. –

Respuesta

9

Muy bien, parece que me di cuenta de la respuesta a mi propia pregunta unos 5 minutos después de la colocación de una recompensa. Parece que current_page? siempre devolverá falso en POST.

Aquí está el código fuente para 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 

No entiendo realmente por qué se han salido de su manera de hacer current_page? trabajo sólo para GET peticiones, pero al menos ahora sé que eso es como es

+0

Probablemente deberías aceptar tu respuesta y eliminar la recompensa. –

+0

No puedo hacer eso porque, como pueden ver, solo respondí la pregunta hace una hora. –

+4

Si alguien más tiene la misma frustración que yo tuve, encontré una solución al problema '' current_page? 'Aquí: http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -nombre –

0

Estaba teniendo el mismo problema al usar POST. Mi solución fue hacer algo como esto

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 

donde link_path es sólo url_for(action: 'action', controller: 'controller')

2

Se puede crear un nuevo método current_path? en su ApplicationHelper:

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

Ir a una o más rutas y se devuelve verdadero si alguno coincide con la ruta actual del usuario:

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

O bien, puede crear un nuevo método current_request? ayudante para comprobar el controlador de Rails + acción:

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

pase en uno o más controladores + acción y que devuelve verdadero si cualquier partido de solicitud actual del usuario:

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

== == ACTUALIZACIÓN

Ok, he decidido hacer uso de current_request? un poco menos detallado por no req uiring que escriba el controlador cuando usted está tratando de coincidir con múltiples acciones:

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 

Ahora usted puede hacer esto:

current_request?(controller: 'users', action: ['new', 'create']) 
Cuestiones relacionadas