Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否有任何Rails函数来检查是否存在部分错误?_Ruby On Rails_Partial - Fatal编程技术网

Ruby on rails 是否有任何Rails函数来检查是否存在部分错误?

Ruby on rails 是否有任何Rails函数来检查是否存在部分错误?,ruby-on-rails,partial,Ruby On Rails,Partial,当我渲染一个不存在的部分时,我会得到一个异常。我想在渲染部分之前检查它是否存在,如果它不存在,我将渲染其他部分。我在.erb文件中执行了以下代码,但我认为应该有更好的方法: <% begin %> <%= render :partial => "#{dynamic_partial}" %> <% rescue ActionView::MissingTemplate %> Can't show this data!

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

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

“#{dynamic_partial}”%>
无法显示此数据!

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

<%= render :partial => "#{dynamic_partial}" rescue nil %>
“#{dynamic_partial}”rescue nil%>
基本上,如果部分不存在,什么也不做。但是,如果缺少部分,是否要打印一些内容

编辑1:哦,我的阅读理解能力不好。你说过你想做点别的。那样的话,这个怎么样

<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>
“#{dynamic_partial}”救援呈现:partial=>“partial_实际存在”%>

“#{dynamic_partial}”rescue“无法显示此数据!”%>
编辑2:

备选方案:检查部分文件是否存在:

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

从视图内部看,模板是否存在?工作,但调用约定不适用于单个部分名称字符串,而是接受模板_存在?(名称、前缀、部分)

要检查路径上是否存在部分错误,请执行以下操作: app/views/posts/_form.html.slim

使用:


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

lookup_context.find_all('posts/_form').any?
与我见过的其他解决方案相比,它的优势在于它可以查看所有视图路径,而不仅仅是rails根。这对我很重要,因为我有很多rails引擎


这也适用于Rails 4。

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

template_exists?("#{dynamic_partial}", _prefixes, true)
template\u存在?
被委托给
lookupcontext
,如中所示

\u前缀
给出控制器继承链的上下文

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


我知道这个问题已经得到了解答,而且已经有一百万年的历史了,但下面是我最后如何为自己解决这个问题的

轨道4.2

首先,我把它放在我的应用程序_helper.rb中

  def render_if_exists(path_to_partial)
    render path_to_partial if lookup_context.find_all(path_to_partial,[],true).any?
  end
现在不是打电话

我只是打电话给


希望有帮助。(没有在rails3中尝试过)

我已经在很多场合使用过这个范例,并取得了巨大成功:

<%=
  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
%>

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

  • 这个部分确实不见了
  • 分部存在,但由于某种原因引发了错误

如果我们只使用代码
“#{dynamic_partial}”rescue nil%>
或某些派生代码,则该部分可能存在,但会引发一个异常,该异常将被默默地吃掉,并成为调试的痛苦来源。

您自己的助手如何:

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

我的问题是,我不想使用异常来执行流控制,这是一种反模式:异常是一种流控制类型,用于处理超出程序正常操作范围的事件。如果动态部分应该在那里,但出了问题,它最终不在那里,那么这就是对例外的合理使用(当然,依我看,正确使用例外本身就是一场圣战)。我想说,您的替代方法是检查文件系统是否存在实际文件。我会用这段代码更新我的答案。我喜欢这个解决方案,尽管它会吞下在部分代码中抛出的任何类型的异常。如果您有不同类型的异常,
rescue nil
。。。rescue…
方法将隐藏它。这会导致很难调试的bug。我真的不喜欢这个解决方案。救援费用昂贵,文件是否存在?假定分部只能位于一个位置@我相信Rein使用lookup_上下文的解决方案是可行的。在Rails 3.0.10上,我发现如果我有一个替代的扩展,比如app/views/posts/_foo.txt.erb,我需要将它添加到参数中,因为:template_exists?(“foo.txt”,“posts”,true)这在Rails 3.2中是不推荐的,但是在Rails 3.2.x中似乎没有委托,第二个参数是前缀数组。此外,它存在于当前控制器上。您可以使用lookup_context.prefixes作为第二个参数:lookup_context.template_exists?(“form”,lookup_context.prefixes,true)。就从视图层访问此信息而言,这是更好的答案。使用
rescue
的答案有风险。在使用它之前,我会先看看其他的解决方案。lookup_context.exists('posts/find')对我不起作用。相反,我在本例中使用了lookup_context.exists?(名称、前缀、部分)或lookup_content.exists('find','posts',true)。这是检查模板(源)的当前(rails>=3.2)方法。如果部分与当前视图模板位于同一文件夹中,则可以使用
lookup_context.exists?('find',lookup_context.prefixes,true)
。这样,您就不需要将视图目录硬编码到调用中。注意,这是用于分部的。对于非partials,省略最后一个参数(或使用false代替true)向上投票。对参数的更新和更好的解释。从视图(如布局)来看,这是有效的:
lookup\u context.template\u exists?(“导航栏”,controller.\u前缀,:partial)
。这告诉我呈现此布局的当前模板是否具有声明的“导航栏”部分,如果是,我可以呈现它。我传递
:partial
只是为了明确说明布尔值是什么--
:partial
是真实的。谢谢你的前缀@Flackou!如果要调用位于不同父目录中的分部,请将
\u前缀
替换为
nil
。如果需要,则此操作无效
<%=
  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
%>
def render_if_exists(path, *args)
  render path, *args
rescue ActionView::MissingTemplate
  nil
end