Когда я визуализирую несуществующий партиал, я получаю исключение. Я хотел бы проверить, существует ли партиал перед рендерингом, и если он не существует, я сделаю что-нибудь еще. Я сделал следующий код в своем файле .erb, но я думаю, что должен быть лучший способ сделать это:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Даниэль Кукьер
источник
источник
rescue
, рискован. Я бы посмотрел на другие решения, прежде чем использовать его.Ответы:
В настоящее время я использую в своих проектах Rails 3 / 3.1 следующее:
Преимущество перед другими решениями, которые я видел, заключается в том, что это будет выглядеть во всех путях просмотра, а не только в корневом каталоге rails. Для меня это важно, потому что у меня много рельсовых двигателей.
Это также работает в Rails 4.
источник
lookup_context.exists?("find", lookup_context.prefixes, true)
. Таким образом, вам не нужно жестко закодировать каталог просмотра в вызове. Обратите внимание, это для частичных файлов. Для non-partials, опустите последний аргумент (или используйте false вместо true)Я тоже боролся с этим. В итоге я использовал этот метод:
В принципе, если частичное не существует, ничего не делайте. Вы хотели что-то напечатать, если часть отсутствует?
Изменить 1: О, я не понимаю прочитанного. Вы сказали, что хотите сделать что-то еще. В таком случае, как насчет этого?
или
Изменить 2:
Альтернатива: проверка существования частичного файла:
источник
rescue nil
и... rescue ...
методы будут скрывать. Это приводит к ошибкам, которые трудно отладить.Изнутри представления template_exists? работает, но соглашение о вызовах не работает с одной строкой частичного имени, вместо этого используется template_exists? (имя, префикс, частичное)
Чтобы проверить частичное на пути: app / views / posts / _form.html.slim
Использование:
источник
В Rails 3.2.13, если вы находитесь в контроллере, вы можете использовать это:
template_exists?
делегированоlookupcontext
, как вы можете видеть вAbstractController::ViewPaths
_prefixes
дает контекст цепочки наследования контроллера.true
потому что вы ищете частичный (вы можете опустить этот аргумент, если вам нужен обычный шаблон).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
источник
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Это говорит мне, имеет ли текущий шаблон, отображающий этот макет, указанную частичную «панель навигации», и если да, то я могу ее отобразить. Я прохожу мимо,:partial
чтобы четко:partial
указать, что это за логическое значение - правда. Спасибо за_prefixes
бит, @Flackou!_prefixes
на,nil
если вы вызываете партиал, находящийся в другом родительском каталоге.Я знаю, что на это есть ответ, и ему миллион лет, но вот как я в конечном итоге исправил это для себя ...
Рельсы 4.2
Сначала я помещаю это в свой application_helper.rb
и теперь вместо звонка
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
я просто звоню
<%= render_if_exists "#{dynamic_path}" %>
надеюсь, это поможет. (не пробовал в rails3)
источник
def render_if_exists(*args); render(*args) if ...
для этогоЯ много раз использовал эту парадигму с большим успехом:
Преимущество приведенного выше кода заключается в том, что мы можем обрабатывать отдельные случаи:
Если мы просто воспользуемся кодом
<%= render :partial => "#{dynamic_partial}" rescue nil %>
или какую-то производную, партиал может существовать, но вызывать исключение, которое будет незаметно съедено и станет источником боли для отладки.источник
А как насчет собственного помощника:
источник