Ketika saya membuat sebagian yang tidak ada, saya mendapatkan Pengecualian. Saya ingin memeriksa apakah ada parsial sebelum merendernya dan jika tidak ada, saya akan merender yang lain. Saya melakukan kode berikut di file .erb saya, tetapi saya pikir seharusnya ada cara yang lebih baik untuk melakukan ini:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Daniel Cukier
sumber
sumber
rescue
berisiko. Saya akan melihat solusi lain sebelum menggunakannya.Jawaban:
Saat ini, saya menggunakan yang berikut ini di proyek Rails 3 / 3.1 saya:
Keuntungan dari solusi lain yang pernah saya lihat adalah ini akan terlihat di semua jalur tampilan, bukan hanya root rel Anda. Ini penting bagi saya karena saya memiliki banyak mesin rel.
Ini juga berfungsi di Rails 4.
sumber
lookup_context.exists?("find", lookup_context.prefixes, true)
. Dengan cara ini, Anda tidak perlu melakukan hard-code direktori view ke dalam panggilan. Perhatikan, ini untuk sebagian. Untuk non-parsial, hilangkan argumen terakhir (atau gunakan false, bukan true)Saya juga berjuang dengan ini. Ini adalah metode yang akhirnya saya gunakan:
Pada dasarnya, jika parsial tidak ada, jangan lakukan apa-apa. Apakah Anda ingin mencetak sesuatu jika parsial hilang?
Sunting 1: Oh, saya gagal dalam membaca pemahaman. Anda mengatakan bahwa Anda ingin merender sesuatu yang lain. Kalau begitu, bagaimana dengan ini?
atau
Edit 2:
Alternatif: Memeriksa keberadaan file parsial:
sumber
rescue nil
dan... rescue ...
akan menyembunyikannya. Itu mengarah ke bug yang sulit di-debug.Dari dalam tampilan, template_exists? berfungsi, tetapi konvensi pemanggilan tidak berfungsi dengan string nama parsial tunggal, melainkan dibutuhkan template_exists? (nama, awalan, parsial)
Untuk memeriksa parsial di jalur: app / views / posts / _form.html.slim
Menggunakan:
sumber
Di Rails 3.2.13, jika Anda menggunakan pengontrol, Anda dapat menggunakan ini:
template_exists?
didelegasikan kelookupcontext
, seperti yang Anda lihat diAbstractController::ViewPaths
_prefixes
memberikan konteks rantai pewarisan pengontrol.true
karena Anda sedang mencari sebagian (Anda dapat menghilangkan argumen ini jika Anda menginginkan templat biasa).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
sumber
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Ini memberi tahu saya jika template saat ini yang merender tata letak ini memiliki sebagian "navbar" yang dinyatakan, dan jika demikian saya dapat merendernya. Saya lulus:partial
hanya untuk secara eksplisit tentang apa itu boolean -:partial
itu benar. Terima kasih untuk_prefixes
bitnya, @Flackou!_prefixes
dengannil
jika Anda memanggil parsial yang ada di direktori induk yang berbeda.Saya tahu ini telah dijawab dan berusia satu juta tahun, tetapi inilah cara saya akhirnya memperbaikinya untuk saya ...
Rel 4.2
Pertama, saya taruh ini di application_helper.rb saya
dan sekarang alih-alih menelepon
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
saya baru saja menelepon
<%= render_if_exists "#{dynamic_path}" %>
semoga membantu. (belum mencoba di rails3)
sumber
def render_if_exists(*args); render(*args) if ...
untuk ituSaya telah menggunakan paradigma ini dalam banyak kesempatan dengan sukses besar:
Manfaat kode di atas adalah kita dapat menangani dua kasus tertentu:
Jika kita hanya menggunakan kode
<%= render :partial => "#{dynamic_partial}" rescue nil %>
atau beberapa turunan, parsial mungkin ada tetapi memunculkan pengecualian yang akan dimakan secara diam-diam dan menjadi sumber kesulitan untuk di-debug.sumber
Bagaimana dengan penolong Anda sendiri:
sumber