2009-05-06 66 views
16

Tôi có một thực đơn mà là một ultab Highlight trong menu

Home | Calendar | Settings 

Tôi muốn nhấn mạnh (thông qua một lớp css) tab được chọn trong menu.

Một số liên kết (Home và Lịch) cũng có subselections

Home | *Calendar* | Settings 
------------------------- 
Add event | Edit event 

Ofcourse khi chỉnh sửa sự kiện được chọn, Lịch nên vẫn được đánh dấu.

Tôi có thể tiếp cận tốt nhất bằng cách sử dụng đường ray và css như thế nào?

Cảm ơn

Trả lời

35

Cách đơn giản nhất là kiểm tra xem bộ điều khiển nào đang được sử dụng. Tôi đã tạo nên tên bộ điều khiển, vì vậy tất nhiên bạn sẽ thay thế 'nhà riêng', 'lịch' và 'cài đặt' bằng tên chính xác.

<ul> 
    <li class="<%= "highlighted" if params[:controller] == "home" %>">Home</li> 
    <li class="<%= "highlighted" if params[:controller] == "calendar" %>">Calendar</li> 
    <li class="<%= "highlighted" if params[:controller] == "settings" %>">Settings</li> 
</ul> 
+0

Đây chính là cách tôi đã thực hiện trước đây. – Owen

+0

cảm ơn, không nghĩ đến tham số điều khiển – Tarscher

2

Tôi có cùng một vấn đề và kết thúc việc tạo người giúp đỡ. về cơ bản nó thay thế các helper link_to url nên quấn liên kết với li và thêm lớp "menu_selected" nếu bộ điều chỉnh dòng phù hợp với điều khiển liên kết

mẫu sử dụng

<%= menu_link_to "Home", home_path %> 

def menu_link_to(*args, &block) 
    url = args[1] 
    mapping = ActionController::Routing::Routes.recognize_path(url) 

    class_property = "menu_selected" if mapping[:controller] == controller.controller_path 
    content_tag :li, :class => class_property do 
    link_to *args, &block 
    end 
end 
 
+1

Tôi đã thêm 'if (args [1] .is_a? (Hash)) url = url_for (args [1])' để nhận dạng kiểu cũ:: controller /: action' định dạng. – jessecurry

5

tôi định cư trên giải pháp này mà tôi thích rất nhiều:

Trong helper

def active_if(options) 
    if params.merge(options) == params 
    'nav-active' 
    end 
end 

Và trong giao diện xác định những gì làm cho con đường duy nhất:

<%= link_to 'Home', root_path, class: active_if(action: 'home') %> 
<%= link_to 'Aricles', articles_path, class: active_if(controller: 'articles') %> 
+0

Đây là giải pháp tốt nhất và linh hoạt nhất được đề xuất ở đây vì nó cho phép khớp với bất kỳ thứ gì trong 'params'. Bạn nhận được +1 của tôi. –

1

Update để trả lời @ ahmy cho Rails 3.2:

def menu_list_item(*args, &block) 
    url = args[1] 
    mapping = Rails.application.routes.recognize_path(url) 

    li_class = 'active' if mapping[:controller] == controller.controller_path 
    content_tag :li, :class => li_class do 
    link_to *args, &block 
    end 
end 

ví dụ Rails.application.routes.recognize_path thay vì ActionController::Routing::Routes.recognize_path.

Các vấn đề liên quan