Rails 如果文件存在则渲染视图

Rails Render View If File Exists

我正在创建基于设备模板的模块化 Rails 模板。我有主要的应用程序布局:

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= content_for?(:title) ? yield(:title) : "Rails Devise" %></title>
    <meta name="description" content="<%= content_for?(:description) ? yield(:description) : "Rails Devise" %>">
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <header>
      <%= render 'layouts/navigation' %>
    </header>
    <main role="main">
       <%= render 'layouts/messages' %>
       <%= yield %>
    </main>
    <footer>
       <% if File.exist?('layouts/footer') %>
          <%= render 'layouts/footer' %>
       <% end %>
    </footer>
  </body>
</html>

我有一个页脚模板,如果文件存在(可能不存在),我想将其包括在内:

_footer.html.erb

<p class="text-muted">
  &copy; <%= Time.now.year.to_s %> All rights reserved
</p>

File.exist?当它在那里时不渲染页脚。如何仅在模板文件存在的情况下包含页脚?

尝试在 render 末尾使用 rescue nil

render nil 什么都不显示。

<%= render 'layouts/footer' rescue nil %>

希望对你有帮助,干杯!

不要使用rescue,这可能非常危险。这样比较好

<% if File.exists? Rails.root.join('app/views/layouts/footer.html.erb') %>
  <%= render 'layouts/footer'  %>
<% end %>

rescue 策略或 Fail.exists? 策略更好的答案是使用 template_exists?.

更好,因为它使用了缓存

<% if lookup_context.template_exists?('layouts/footer') %>
  <%= render 'layouts/footer'  %>
<% end %>

有关 template_exists?

的更多信息