1


1

Rails 3-AjaxでSubnavを読み込む…​ どのコントローラーがサブナビを所有していますか?

Rails 3アプリがロードされると、ユーザーは項目をクリックして、動的サブナブをロードする必要があります。

私の考えは(動的である必要があるため)サーバーへのjQuery AJAX呼び出しを行い、ページのDIVにHTML応答を挿入するonClickです…​

私があなたにアドバイスしたいのは、ナビゲーションコントローラーやビューがないので、subnavロジックがrailsアプリでどのように/どこにあるべきかということです…​ しかし、多分私はそれを持っているべきですか?

Navigation Controllerを作成しますか? または、アプリケーションコントローラーを使用しますか? また、ランディングページ、約、連絡先などに使用するページコントローラーもあります。

ありがとうございます。

1 Answer


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

メインナビゲーションが必要なレイアウトファイルでは、レンダリングするだけです。

したがって、明日でも突然2つまたは3つの異なるナビゲーションメニューが必要になり、そこにajax呼び出しがあれば、それらをすべてアプリケーションコントローラー内に置くのではなく、それらを処理するための中央の場所があります。

もう1つの提案は、いくつかのスコープでNavigation Controllerを生成することです。 app / controllers / page_structures / navigation_controller.rb`のように、ビューは app / views / page_structures / navigation / `にあります

このようにして、サイドバー、カスタムヘッダー、バナーなど、ページ構造に関連するすべてのものを同じスコープpage_structures内に配置できます。

更新=====

AJAX呼び出しは比較的静的なように見えるため、パスは何らかの直接一致を使用することをお勧めします。

推測が正しければ、トップナビゲーションにはいくつかのアイテムがあり、各アイテムには独自のサブメニューがあります。 そのため、サブメニューをすべてではなく1つずつロードする必要があります。 (実際にすべての場合、レンダリングにすべてを含めることができます…​)

/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などを受け入れるNavigation Controller それでも、これらのテンプレートファイルは同じファイリング方法に従うことができます。