3

ネストされたレイアウトにはほとんど問題がありません。私のサイトでは、管理者専用のサイトの別の部分を作成する必要があります。

私は自分のapplication.html.erbファイルにこれを持っています:

<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
        <%= render 'layouts/footer' %>
    </div>
</body>

このような別のテンプレートを内部に挿入するにはどうすればよいか疑問に思っていまし<%= yield %>た. との代わりに2 つのメニューがあります。上部にメニューがあり、管理コントローラーからのアクションで満たされる新しいテンプレートでいっぱいになりたいです。そのため、メニューは常に一番上に表示されます。headerfooterheaderfooter<%= yield %><%= yield %>

メニューを部分的に作成しましたviews/admins/_menu.html.erb

<div>  
    <div>  
        <div class="container">  
            <ul>
                <li><%= link_to "Action1", '#' %></li>
                <li><%= link_to "Action2", '#' %></li>
                <li><%= link_to "Action3", '#' %></li>
            </ul>
        </div>  
    </div>  
</div> 

私の新しいレイアウトはlayouts/sublayouts/admin.html.erb次のとおりです。

<%= render 'admins/menu' %>
<%= yield %>

現在の代替手段はviews/admins/_menu.html.erb、各ビューを一番上にレンダリングすることですが、それは私にとって良い解決策とは思えません。

通常のサイトの構造は次のとおりです。

Header/Menu
   |
Container
   |Content
Footer

また、管理サイトは次の構造になります。

Header/Menu
   |
Container
   |Content
     |Admin Menu
     |Admin Content
   |
Footer

これを達成するための最良の方法は何ですか?

4

2 に答える 2

1

通常、同じ問題を解決するために次のことを行います。親クラスに基づいて別のレイアウトを作成します。

application_controller.rb

class ApplicationController < ActionController::Base    
  protect_from_forgery
  layout :layout

  private
  def layout
    if self.class.parent == Admin
      'application_admin'
    else
      'application'
    end
  end
end

アプリ/ビュー/レイアウト/application.html.haml

Header/Menu
   |
Container
   |Content
Footer

アプリ/ビュー/レイアウト/application_admin.html.haml

Header/Menu
   |
Container
   |Content
     |Admin Menu
     |Admin Content
   |
Footer

更新 1


config/routes.rb

namespace :admin do
  root to: 'home#index'
  resources :admins
end

アプリ/コントローラー/管理者/admins_controller.rb

class Admin::AdminsController < ApplicationController
  def index
    // code
  end
end
于 2014-02-14T18:14:46.327 に答える
1

更新:コメントに基づいて、質問をよりよく理解して回答を更新しました

application.html.erb最良の方法は、これをレイアウトに組み込むことです。

望ましい動作は、ユーザーがAdmin Panelリンクまたは管理メニューのリンクをクリックしたときに管理メニューが表示されるようにすることです。

これを実行することをお勧めする方法は、すべての管理ビューへのルーティングを処理する管理コントローラーを用意することです。そのため、Admin Panelボタンをクリックすると、管理メニューのすべてのリンクが管理コントローラーによって処理されます。次のように、管理コントローラーに before_filter を追加します。

# app/controller/admin_controller.rb
class AdminController < ActionController::Base
  before_filter: set_admin_status

  private
  def set_admin_status
   @admin = true
  end
end

アプリケーション テンプレートで、次の操作を行います。

# application.html.erb
<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <% if @admin %>
          <%= render 'admins/menu' %>
        <% end %>
        <%= yield %>
        <%= render 'layouts/footer' %>
    </div>
</body>

これがすべきことは、管理メニューのリンクまたはいずれかのリンクに対応するページに移動するAdmin Panelたびに、@admin_status フラグが true に設定され、レイアウトが管理メニューをレンダリングすることです。行動。

于 2014-02-14T18:11:39.970 に答える