是否有任何Rails函数来检查是否存在部分?

时间:2010-08-24 17:51:32

标签: ruby-on-rails partial

当我渲染一个不存在的部分时,我得到一个例外。我想在渲染之前检查是否存在部分,如果它不存在,我将渲染其他内容。我在.erb文件中执行了以下代码,但我认为应该有更好的方法来执行此操作:

    <% begin %>
      <%= render :partial => "#{dynamic_partial}" %>
    <% rescue ActionView::MissingTemplate %>
      Can't show this data!
    <% end %>

7 个答案:

答案 0 :(得分:97)

目前,我在Rails 3 / 3.1项目中使用以下内容:

lookup_context.find_all('posts/_form').any?

我见过的其他解决方案的优势在于它将在所有视图路径中查找,而不仅仅是您的rails根目录。这对我很重要,因为我有很多rails引擎。

这也适用于Rails 4。

答案 1 :(得分:69)

我也在努力解决这个问题。这是我最终使用的方法:

<%= render :partial => "#{dynamic_partial}" rescue nil %>

基本上,如果部分不存在,则什么都不做。但是,如果缺少部分内容,是否要打印一些内容?

编辑1:哦,我在阅读理解上失败了。你确实说过想要渲染别的东西。在那种情况下,这个怎么样?

<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>

<%= render :partial => "#{dynamic_partial}" rescue "Can't show this data!" %>

编辑2:

替代方案:检查是否存在部分文件:

<%= render :partial => "#{dynamic_partial}" if File.exists?(Rails.root.join("app", "views", params[:controller], "_#{dynamic_partial}.html.erb")) %>

答案 2 :(得分:51)

从视图中,template_exists?有效,但调用约定不适用于单个部分名称字符串,而是需要template_exists?(名称,前缀,部分)

检查部分路径:    应用程序/视图/帖/ _form.html.slim

使用:

lookup_context.template_exists?("form", "posts", true)

答案 3 :(得分:30)

在Rails 3.2.13中,如果你在控制器中,你可以使用它:

template_exists?("#{dynamic_partial}", _prefixes, true)

template_exists?被委托给lookupcontext,您可以在AbstractController::ViewPaths

中看到

_prefixes给出了控制器继承链的上下文。

true因为您正在寻找部分(如果您想要常规模板,可以省略此参数)。

http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F

答案 4 :(得分:8)

我知道这已经回答了,并且已经有百万年的历史了,但是这就是我最终为我解决这个问题的方法......

Rails 4.2

首先,我把它放在我的application_helper.rb

  def render_if_exists(path_to_partial)
    render path_to_partial if lookup_context.find_all(path_to_partial,[],true).any?
  end

现在而不是调用

<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>

我只是致电<%= render_if_exists "#{dynamic_path}" %>

希望有所帮助。 (还没试过rails3)

答案 5 :(得分:5)

我曾多次使用这种模式取得了巨大的成功:

<%=
  begin
    render partial: "#{dynamic_partial}"
  rescue ActionView::MissingTemplate
    # handle the specific case of the partial being missing
  rescue
    # handle any other exception raised while rendering the partial
  end
%>

上述代码的好处是我们可以处理两个特定情况:

  • 部分确实缺失
  • 部分存在,但由于某种原因它出错了

如果我们只使用代码<%= render :partial => "#{dynamic_partial}" rescue nil %>或某些派生词,那么部分可能会存在,但会引发一个异常,这个异常将被静默吃掉并成为调试的痛苦根源。

答案 6 :(得分:4)

你自己的助手怎么样:

def render_if_exists(path, *args)
  render path, *args
rescue ActionView::MissingTemplate
  nil
end