2011-08-14 22 views
0

我正在構建一種輕鬆在我的視圖中包含導航(選項卡和subnavs)的方法。我應該可以爲不同的控制器提供不同的導航,並且可以針對這些控制器中的不同操作。Rails導航

目前我使用這個簡單的helper方法:

def nav_for(tabs_hash, *active_tabs) 
    content_tag(:div, 
    tabs_hash[:tab_info].map { |tab| tab == 'spacer' ? 
          content_tag(:div, '', :class => 'nav-spacer') : 
          link_to(tab[:name], tab[:path], :class => [tab[:class], ("active" if active_tabs.include? tab[:id])].join) 
        }.join("\n").html_safe, 
    :class => tabs_hash[:div_class]) 
end 

這需要一個散列,其中包括了導航項目信息,並對其進行解析出來。我將這些哈希值放在控制器中的方法中,但是這阻止了我從其他控制器訪問導航哈希值。

我的問題是,哪裏會是最好的地方來存儲導航信息?訪問參數也很重要,因爲某些鏈接是基於查詢字符串動態生成的。

我只是尋找這種情況下的最佳做法。謝謝!

+1

雖然花費在導航上的時間,我更喜歡使用客戶端JS來做到這一點。這是一個邏輯分工。 – Anatoly

回答

0

我會說在助手中使用格式和標記是一個糟糕的主意,爲什麼不把它分成一個佈局部分,它會從你的視圖中抽象數據。至於存儲數據,我會考慮在運行時需要多麼靈活。你能用YAML文件來定義鏈接嗎?

+0

我不認爲YAML文件可以工作,即使我真的想使用它,主要是因爲,正如我所說的,一些鏈接是基於查詢字符串動態生成的。 – bricker

+0

只要這些數據是您信任和生成的,'eval'就是您的朋友。 –

1

您應該使用Simple Navigation寶石進行調查。它完全符合你所要做的,配置選項非常強大。

0

我認爲有以下可能會爲你工作:

  • 使用您的輔助方法,利用哈希的一個參數。
  • 在你的超級控制器定義一個類方法(例如def ApplicationController.tabs_hash(params) ...
  • 在該方法中,定義的散列,可以通過所有其它的控制器中使用的默認結構,而是通過一系列的其他類的方法中定義它。 def ApplicationController.tabs_hash(params);self.top_hash(params);self.middle_hash(params);self.bottom_hash(params);end
  • 您現在可以定義在控制器的具體方法(類方法)。如果你願意,你可以混合和從其他控制器的匹配方法。
  • 如果沒有定義,你會使用ApplicationController定義默認行爲

該模式是抽象方法的模式,它在這裏工作,因爲Ruby在類方面也使用繼承,所以類方法也可以使用super。