4


0

アドバイスが必要です:サブメニュー用のRailsビューの構造?

アプリケーションに2つのRESTfulコントローラ(UsersController、OfferController)と1つのPagesController(インデックスなどの静的コンテンツに使用される)があるとします。

以下のルートが定義されています。

map.with_options :controller => 'pages' do |pages|
  pages.root :action => 'index'     # static home page
  pages.about :action => 'about'    # static about page
  # maybe more static pages...
end
map.resources :users    # RESTful UsersController
map.resources :posts    # RESTful PostsController

アプリケーションのレイアウトは次のようになります。

    Demo Application




         <%= link_to 'Home', root_path %>


         <%= link_to 'Offers', offers_path %>

           <%= link_to 'New User', new_user_path %>
           <%= link_to 'New Offer', new_offer_path %>
           maybe more links



    <%= yield %>

レイアウトの問題は、私はいつでも一つの `#submenu`だけが見えるようにしたいということです。 他のすべてのサブメニューは完全にスキップできます(まったくレンダリングする必要はありません)。

たとえば、管理メニューを見てください。このメニューはアプリケーションのすべてのRESTfulなパス(offer_pathを除く)に対してアクティブになるはずです。 アクティブはサブメニューが表示されていることを意味します。

これを達成するために私が考えることができる唯一の解決策は、条件とそれが吸うなら非常に複雑なものを作ることです(書くことと維持することは本当に複雑です)。 私はエレガントな解決策を探していますか?

誰かが私の質問を理解していることを願っています - 不明な点がある場合はその質問にコメントしてください。私はそれをより詳細に説明するつもりです。

2 Answer


6


あなたが遊ぶことができる一つのことはメニューのためのいくつかのパーシャルと一緒に使われるyieldとcontent_forです。 たとえば、メニューの各セクションを部分的に配置してから、レイアウトを次のように変更できます。

<%= yield(:menu)%>

その後、あなたのビューでcontent_forを指定し、あなたがメニューに欲しいものを何でも入れることができます。 指定されていない場合はレンダリングされません。

<%content_for(:menu)do%> <%= render:partial => 'layouts / menu'%> <%= render:partial => 'layouts / search_menu'%>など... <%end%>

ほとんどのページで同じメニューを多数使用している場合、yield(:menu)が見つからない場合はレイアウトにデフォルトを指定してください。

<%= yield(:menu)|| render:partial => 'layouts / menu_default'%>

あなたのタイピングの手間を省きます。 :)私はこれが物事を処理するための素晴らしいきれいな方法であることがわかった。


1


通常は、管理メニューをレンダリングするためのヘルパーメソッドを持つように、メニュー機能を抽象化します。 このように、ビューロジックを混乱させることなく、必要なだけロジックをヘルパーに投入することができます。

そのため、あなたのヘルパーは次のようになります(ruby / rails疑似コードはご容赦ください。私が触れてから1〜2ヶ月が経ちました)。

def render_admin_menu()if!current_path.contains( 'offer')render:partial => 'shared / admin_menu' end end