2010-09-26 32 views
1

一旦加載了我的Rails 3應用程序,用戶可以點擊需要加載動態subnav的項目。Rails 3 - 使用Ajax加載Subnav ....哪個控制器擁有一個subnav?

我的想法是(因爲它需要是動態的)是的onClick做一個jQuery的AJAX調用服務器,然後注入HTML響應到頁面上的DIV ...

我會像你的建議是如何/在哪裏subnav邏輯應該住在rails應用程序中,因爲我沒有導航控制器或視圖...但也許我應該有一個?

我是否創建導航控制器?或者使用應用程序控制器?我也有一個頁面控制器,我使用的着陸頁,約,聯繫等...

謝謝!

回答

1

對於我來說,我會用一個導航控制器,而不是應用程序控制器應用控制器生長極其複雜容易。

這應該app/views/navigation創建視圖文件夾。我也將所有的導航模板放在這裏(包括你的主導航)。

所以有可能是這些文件:

app/views/navigation/ 
    _main_nav.html.erb # made it a partial file for including in other pages 
    subnav.html.erb # or subnav.js.erb if you don ajax call and return scripts 

,並在你的佈局文件,要將主NAV,你只呈現它。

所以,即使明天你突然想兩個或三個不同的導航菜單,有ajax調用,你有一個集中的地方來處理它們,而不是把他們所有的應用控制器內。

另一個更多的建議是,在某些範圍內生成導航控制器。像app/controllers/page_structures/navigation_controller.rb,所以你的意見將在app/views/page_structures/navigation/

這樣,你可以把所有的頁面結構相關的東西,如側邊欄,自定義標題,橫幅等在同一範圍page_structures內。

===== UPDATE =====

由於您的AJAX調用似乎相對靜態的,我建議你的路使用某種直接的匹配。

如果我的猜測是正確的,你的頂部導航有一些項目,每個項目都有自己的子菜單。所以你會想要一個一個加載子菜單,但不是全部。 (如果實際上它是所有,那麼你可以只包括他們所有的渲染......)

/page_structures/:top_nav/:sub_nav_template_name # So in here I assumed you will have many navigations and sub-nav to load. 

那麼我們匹配這個路徑以下行動:

def get_sub_nav 
    # checks both params[:top_nav] and params[:sub_nav_template_name] exist and not pointing to some other dangerous place. (I don't know if this work if the input is './' or '../' these kind of things 
    render "page_structures/navigation/#{params[:top_nav]}/#{params[:sub_nav_template_name]}" 
end 

通過這個簡單的動作,只要你添加更多導航/導航項目,您只需創建相應的AJAX響應模板。這樣,你正在做最小的事情!

當然,如果一些如何有一些項目需要返回一些其他的數據作爲響應,如響應子類,你可能需要創建其他途徑讓你通過你的父類的ID。

你可以這樣想:我的建議是爲默認的相對靜態的集中式子導航 但是如果你需要一些專門的子導航,需要其他數據處理,每一個你必須創建一個路線並在導航控制器中接受您的類別ID,產品ID等的動作。但是,這些模板文件仍然可以遵循相同的歸檔方式。

+0

非常酷,我現在要試試...你對路線有什麼建議,因爲我正在做一個AJAX調用來獲取subnav?/page_structures/nav/subnav /? – AnApprentice 2010-09-26 03:09:18

+0

由於這些AJAX調用路徑通常供內部使用,並非公開(並且很可能是發佈請求),所以我至少不介意它們是如何出現的。使用醜陋難猜的路徑可能會增加一些安全問題... – PeterWong 2010-09-26 14:57:34

+0

爲了簡單起見(因爲您的調用看起來只是獲取模板,而不是保存或銷燬任何東西),所以我會建議一些直接映射以儘量減少工作量。請看我的更新...... – PeterWong 2010-09-26 14:59:24