Halaman

Senin, 01 Februari 2010

[shared] nested layout

sesuai dengan yang saia janjikan di post sebelumnya, skarang saia akan membahas soal nested layout.
untuk memudahkan, saia akan mengambil contoh kasus dari post saia sbelumnya, yaitu untuk membuat menu yg berbeda2 tergantung controller yg aktif.


# layouts/application.html.erb
# ...
<div class="menu">
<%= render :partial => "main_menu" %>
</div>
<div class="content">
<%= yield %>
</div>
# ...


diubah menjadi:


# layouts/application.html.erb
# ...
<div class="menu">
<% begin %>
<%= render :partial => "layouts/#{controller.controller_path}_menu" %>
<% rescue ActionView::MissingTemplate %>
<% begin %>
<%= render :partial => "layouts/#{controller.controller_path.sub(/#{controller.controller_name}$/,'default_menu')}" %>
<% rescue ActionView::MissingTemplate %>
<%= render :partial => "main_menu" %>
<% end %>
<% end %>
</div>
<div class="content">
<%= yield %>
</div>
# ...


kode diatas akan mencari layout menu dengan path dan nama controller yg sedang aktif, bila tidak ditemukan default_menu partial dalam path controller aktif akan digunakan, bila tidak ada juga maka main_menu sebagai default akan digunakan. contoh:
  • UsersController akan menggunakan "layouts/_users_menu" || "layouts/_default_menu" || "layouts/_main_menu"
  • Admin::UsersController akan menggunakan "layouts/admin/_users_menu" || "layouts/admin/_default_menu" || "layouts/_main_menu" 
  • Admin::HomeController akan menggunakan "layouts/admin/_home_menu" || "layouts/admin/_default_menu" || "layouts/_main_menu" 
jadi untuk menggunakan menu yang sama pada smua controller untuk admin, buat partial "layouts/admin/_default_menu" dan tentu saja bila dibutuhkan tetap dapat di override dengan "layouts/admin/_[nama_controller]_menu"

dengan menggunakan nested layout, kita cukup menggunakan hanya 1 application layout. walaupun lebih tidak flexible daripada menggunakan content_for yg dapat diatur bergantung pada action. tp menurut saia jauh lebih rapih karena mengurangi kode yg ditulis pada controller.

Tidak ada komentar:

Posting Komentar