3

同じレイアウトを共有するさまざまな名前空間コントローラーがあります。

# /app/controllers/admin/dashboard.rb
class Admins::DashboardController < ApplicationController
  ...
end

# /app/controllers/clients/dashboard.rb
class Clients::DashboardController < ApplicationController
  ...
end

これは私のディレクトリ構造です:

App
|_ Controllers
|  |_ Admins
|  |  |_ dashboard_controller.rb
|  |_ Clients
|     |_ dashboard_controller.rb
|
|_ Views
   |_ Admins
   |  |_ Dashboard
   |     |_ index.html.erb
   |
   |     |_ show.html.erb
   |_ Clients
   |  |_ Dashboard
   |     |_ index.html.erb
   |     |_ show.html.erb
   |_ layouts
      |_ admin.html.erb
      |_ _sidebar.html.erb

Adminsレイアウトが表示されているかどうかを判断したいClientsので、正しいサイドバーを表示できます。次のようなものです。

<% if admins? %>
  ...
<% elsif clients? %>
  ...
<% end %>

また、これはこれにアプローチする最良の方法ですか、それともより良い解決策がありますか?

4

2 に答える 2

1

これを実現するには、テンプレートの継承を使用できます。単純render 'sidebar'に再利用したいレイアウトで、_sidebar テンプレートを次のように定義します。

app/views/admins/dashboard/_sidebar.html.erb  # for Admins::DashboardController
app/views/clients/dashboard/_sidebar.html.erb # for Clients::DashboardController
app/views/application/_sidebar.html.erb         # fallback sidebar

テンプレートの継承により、Rails は適切なサイドバーを自動的に選択します。

対応するサイドバーを他の管理/クライアント コントローラーでも使用したい場合は、次のようにそれぞれに BaseController を設定することもできます。

class Admins::BaseController < ApplicationController

end

class Admins::DashboardController < Admins::BaseController
  ...
end

ここで_sidebar.html.erbテンプレートを作成しapp/views/admins/base/、Admins 名前空間のすべての Controller が Admins::BaseController から継承されるようにします。

これにより、すべての名前空間コントローラーに対しても、共通の機能/コールバックなどを構造化するための非常に優れた方法が開かれることがわかります。_sidebar.html.erbまた、ファイルをより具体的なビューパスに配置するだけで、必要なときにサイドバーのパーシャルを上書きできますapp/views/admins/myspecificsidebars/_sidebar.html.erb

于 2012-07-18T13:25:13.447 に答える
0

のレイアウト方法を使用しますApplicationController

layout :user_layout

def user_layout
  #your layout logic here, return the name of the layout
end
于 2012-07-18T13:01:37.297 に答える