2012-03-17 37 views
6

Tôi có một vấn đề thực sự đơn giản. Tôi có một trang báo cáo và mỗi báo cáo có một tab riêng. Tôi đang sử dụng current_page? để xác định tab nào sẽ được đánh dấu. Khi tôi gửi bất kỳ báo cáo nào, current_page? dường như không hoạt động nữa, rõ ràng vì phương thức yêu cầu là POST.Rails current_page? "không thành công" khi phương thức là POST

Đây có phải là hành vi dự định của current_page? Tôi có một thời gian khó tưởng tượng tại sao điều đó xảy ra. Nếu có, làm thế nào để mọi người thường gặp phải vấn đề này?

Dưới đây là một ví dụ về một cuộc gọi current_page?:

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

+1

Bạn có thể thêm lỗi cho câu hỏi của bạn, bao gồm cách bạn đang sử dụng CURRENT_PAGE ? – AMIT

+0

Tôi chỉnh sửa câu hỏi của mình để bao gồm lệnh gọi 'current_page? '. Tôi không gặp lỗi. Nó chỉ trả về sai. –

Trả lời

9

Được rồi, có vẻ như tôi đã tìm ra câu trả lời cho câu hỏi của riêng tôi khoảng 5 phút sau khi đưa lên một bounty. Có vẻ như current_page? sẽ luôn trả về false trên POST.

Dưới đây là các mã nguồn cho 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 

Tôi thực sự không hiểu tại sao họ đã có thể đi ra khỏi con đường của họ để làm current_page? công việc chỉ dành cho GET yêu cầu, nhưng ít nhất bây giờ tôi biết rằng đó là nó là như vậy.

+0

Bạn có lẽ nên chấp nhận câu trả lời của mình và xóa tiền thưởng. –

+0

Tôi không thể làm điều đó được bởi vì, như bạn có thể thấy, tôi chỉ trả lời câu hỏi một giờ trước. –

+4

Nếu bất kỳ ai khác có cùng sự thất vọng tôi gặp phải, tôi đã tìm thấy cách giải quyết cho vấn đề 'current_page?' "Ở đây: http://stackoverflow.com/questions/5186613/rails-current-page-versus-controller-controller -Tên –

0

Tôi gặp sự cố tương tự khi sử dụng POST. Giải pháp của tôi là để làm một cái gì đó giống như

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 

này, nơi link_path chỉ là url_for(action: 'action', controller: 'controller')

2

Bạn có thể tạo ra một phương pháp mới current_path? trong bạn ApplicationHelper:

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

đèo trong một hoặc nhiều đường dẫn và nó trả về true nếu có khớp với đường dẫn hiện tại của người dùng:

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

Hoặc, bạn có thể tạo ra một phương pháp current_request? helper mới để kiểm tra bộ điều khiển Rails + hành động:

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

đèo trong một hoặc nhiều bộ điều khiển + hành động và nó trả về true nếu bất kỳ trận đấu yêu cầu hiện tại của người dùng:

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

== CẬP NHẬT ==

Ok, tôi quyết định làm bằng current_request? một chút ít tiết bằng cách không req uiring mà bạn gõ ra bộ điều khiển khi bạn đang cố gắng để phù hợp với nhiều hành động:

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 

Bây giờ bạn có thể làm điều này:

current_request?(controller: 'users', action: ['new', 'create']) 
Các vấn đề liên quan