Answers:
当前,我在Rails 3 / 3.1项目中使用以下内容:
lookup_context.find_all('posts/_form').any?
与我见过的其他解决方案相比,优点在于,它可以在所有视图路径中查看,而不仅仅是您的rails根。这对我很重要,因为我有很多Rails引擎。
这也适用于Rails 4。
lookup_context.exists?("find", lookup_context.prefixes, true)
。这样,您无需将视图目录硬编码到调用中。注意,这是局部的。对于非局部变量,省略最后一个arg(或使用false代替true)
我也为此感到挣扎。这是我最终使用的方法:
<%= 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")) %>
rescue nil
和... rescue ...
方法将其隐藏。这导致难以调试的错误。
从内部来看,template_exists?可以,但是调用约定不适用于单个部分名称字符串,而是需要template_exists?(名称,前缀,部分)
要检查路径中的部分内容,请执行以下操作:app / views / posts / _form.html.slim
用:
lookup_context.template_exists?("form", "posts", true)
在Rails 3.2.13中,如果您在控制器中,则可以使用以下命令:
template_exists?("#{dynamic_partial}", _prefixes, true)
template_exists?
委托给lookupcontext
,你可以看到在AbstractController::ViewPaths
_prefixes
给出控制器继承链的上下文。
true
因为您正在寻找局部变量(如果需要常规模板,则可以忽略此参数)。
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
。这可以告诉我当前呈现此布局的模板是否具有规定的“ navbar”部分,如果可以,可以进行渲染。我:partial
只是为了明确表示布尔值是什么- :partial
是真实的。谢谢你_prefixes
,@ Flackou!
_prefixes
为nil
。
我知道这个问题已经被回答,并且已有一百万年的历史了,但是这就是我最终为我解决这个问题的方式...
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中尝试过)
def render_if_exists(*args); render(*args) if ...
它
我已经在很多场合成功使用了这种范例:
<%=
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 %>
或某些派生代码,则部分代码可能存在,但会引发异常,该异常将被静默吃掉,并成为调试时的痛苦之源。
rescue
是有风险的。在使用它之前,我会先看看其他解决方案。