2012-03-17 19 views
6

olduğunda "başarısız", gerçekten basit bir sorun var. Bir rapor sayfam var ve her raporun kendi sekmesi var. Hangi sekmenin vurgulanması gerektiğini belirlemek için current_page? kullanıyorum. Herhangi bir rapor gönderdiğimde, istek yöntemi POST olduğu için, current_page? artık işe yaramıyor.Rails current_page? yöntem POST

Ben zor bir zaman bu durumda olacağını neden tasavvur edilebilir değil current_page? amaçlanan davranış bu mudur. Eğer öyleyse, insanlar normal olarak bu problemi nasıl aşar?

Burada current_page? aramanın bir örnek: Ben yaklaşık 5 dakika bir ödül koyarak sonra kendi soruya cevap anladım gibi

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

+1

Eğer CURRENT_PAGE nasıl kullandıklarını dahil sorunuzun hatayı ekleyebilir miyim:

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 

Şimdi bunu yapabilirsiniz ? – AMIT

+0

"current_page" aramamı eklemek için sorumu düzenliyorum. Hata alamıyorum. Sadece yanlış döndürür. –

cevap

9

Pekala görünüyor. current_page?, POST numaralı telefondan her zaman false değerini döndürecek gibi görünüyor. İşte

current_page? için kaynak kod: onlar sadece GET istekleri için current_page? işi yapmak için kendi yolumdan giderdi neden

# 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 

Gerçekten anlamıyorum, ama en azından artık o olduğunu biliyorum bu şekilde. POST kullanıldığında

+0

Muhtemelen cevabınızı kabul etmeli ve ödülü almalısınız. –

+0

Henüz bunu yapamam çünkü gördüğünüz gibi, bir saat önce sorumu cevapladım. –

+4

Başkası aynı sıkıntıya sahipse, "current_page" sorusuna bir çözüm buldum: "problem": http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -adı –

0

aynı sorunu vardı. link_path sadece nerede Benim çözüm bu

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 

böyle bir şey yapmak oldu url_for(action: 'action', controller: 'controller')

2
Sen yeni current_path? yöntemi oluşturabilirsiniz

senin ApplicationHelper:

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

bir veya daha fazla yollar ve içindeki Geçiş döndüren gerçek herhangi bir kullanıcının geçerli yolu eşleşirse:

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

Veya, Raylar denetleyicisi + eylem denetlemek için yeni bir current_request? yardımcı yöntemi oluşturabilirsiniz: Bir veya daha fazla denetleyici + eylem

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

Geçiş ve doğru dönerse herhangi maç kullanıcının geçerli isteği:

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

== GÜNCELLEME ==

Tamam, biraz daha az ayrıntılı değil isteği tarafından current_request? kullanarak yapmaya karar Eğer birden fazla eylem maç için çalışıyoruz denetleyici dökmek uiring:

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