Halaman

Tampilkan postingan dengan label layout. Tampilkan semua postingan
Tampilkan postingan dengan label layout. Tampilkan semua postingan

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.

Rabu, 20 Januari 2010

[shared] Using content_for from controller

biasanya content_for digunakan untuk passing suatu blok text dr view ke layout, contohnya

layout/application.html.erb

# ...
<div class="menu">
<%= yield :menu %>
</div>
<div class="content">
<%= yield %>
</div>
# ...


homepages/show.html.erb

# ...
<% content_for :menu, generate_menu %>
# ...


nah, terkadang dibutuhkan content_for yg dapat dipanggil di controller. misalkan untuk mengurangi pengulangan dengan menggunakan before_filter (dapat jg menggunakan nested layout, akan saia bahas di post lain).
untuk itu setelah saia coba ternyata hal tersebut dapat diselesaikan dengan mudah, hanya dengan mengisi instance variable dengan nama @content_for_#{nama} dengan contoh diatas berarti:

homepages_controller.rb

# ...
@content_for_menu = generate_menu
# ...


Warning: cara tersebut sudah dicoba di rails 2.3.3 tapi ada kmungkinan deprecated untuk versi rails yang lebih baru.. kalo ada cara yg lebih baik tolong kasi tau saia via comment, thanks ^_^