2012-03-17 15 views
6

मेरे पास वास्तव में एक साधारण समस्या है। मेरे पास रिपोर्ट का एक पृष्ठ है और प्रत्येक रिपोर्ट का अपना टैब है। मैं यह निर्धारित करने के लिए current_page? का उपयोग कर रहा हूं कि कौन सा टैब हाइलाइट किया जाना चाहिए। जब मैं कोई रिपोर्ट जमा करता हूं, current_page? अब और काम नहीं कर रहा है, जाहिर है क्योंकि अनुरोध विधि POST है।रेल वर्तमान_पृष्ठ? विधि विफल होती है जब विधि POST

क्या यह current_page? का इरादा व्यवहार है, मुझे यह समझने में कठिनाई होती है कि ऐसा क्यों होगा। यदि ऐसा है, तो आम तौर पर लोग इस समस्या के आसपास कैसे जाते हैं?

यहाँ एक current_page? कॉल का एक उदाहरण है:

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

+1

आप सहित कैसे आप 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 

अब आप यह कर सकते हैं ? – AMIT

+0

मैं अपना 'current_page?' कॉल शामिल करने के लिए अपना प्रश्न संपादित करता हूं। मुझे कोई त्रुटि नहीं मिल रही है। यह सिर्फ झूठी वापसी करता है। –

उत्तर

9

ठीक है, ऐसा लगता है कि मैं अपने ही सवाल का जवाब पता लगा लगभग 5 मिनट एक इनाम ऊपर डालने के बाद। ऐसा लगता है कि current_page? हमेशा 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 

मैं सच में समझ में नहीं आता क्यों वे अपने रास्ते से बाहर चला गया होता केवल GET अनुरोधों के लिए current_page? काम करने के लिए, लेकिन कम से कम अब मुझे पता है कि वह जिस तरह से यह है।

+0

आपको शायद अपना उत्तर स्वीकार करना चाहिए, और बक्षीस को हटा देना चाहिए। –

+0

मैं अभी तक ऐसा नहीं कर सकता क्योंकि आप देख सकते हैं, मैंने केवल एक घंटे पहले प्रश्न का उत्तर दिया था। –

+4

यदि किसी और के पास एक ही निराशा होती है, तो मुझे यहां 'current_page?' "समस्या" के लिए एक समाधान मिला है: http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -name –

0

POST का उपयोग करते समय मुझे एक ही समस्या हो रही थी। मेरे समाधान जहां link_path बस है इस

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 

की तरह कुछ करने के लिए था url_for(action: 'action', controller: 'controller')

2

आप में एक नया current_path? विधि बना सकते हैं अपने ApplicationHelper:

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

एक या अधिक रास्तों और उस में पास यदि कोई उपयोगकर्ता के वर्तमान पथ से मेल खाता है तो सत्य लौटाता है:

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

या, आप रेल नियंत्रक + कार्य की जांच करने के लिए एक नया current_request? सहायक विधि बना सकते हैं:

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'}) 

== अद्यतन ==

ठीक है, मैं एक छोटे से कम नहीं अनुरोध द्वारा वर्बोज़ current_request? का उपयोग कर बनाने का फैसला किया uiring कि आप नियंत्रक जब आपके पास कई कार्यों मैच के लिए कोशिश कर रहे हैं बाहर टाइप करें:

current_request?(controller: 'users', action: ['new', 'create']) 
संबंधित मुद्दे