Ruby on rails 是否有任何Rails函数来检查是否存在部分错误?
当我渲染一个不存在的部分时,我会得到一个异常。我想在渲染部分之前检查它是否存在,如果它不存在,我将渲染其他部分。我在.erb文件中执行了以下代码,但我认为应该有更好的方法: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!
<% 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