【问题标题】:Rails 3: yield/content_for with some default value?Rails 3:yield/content_for 有一些默认值?
【发布时间】:2011-08-20 19:21:12
【问题描述】:

有什么方法可以检测 #content_for 是否实际应用于 Rails 中的 yield 范围?

一个典型的例子是这样的:

<title><%= yield :page_title %></title>

如果模板没有设置

<% content_for :page_title, "Something here" %>

有没有办法让布局放其他东西呢?

我尝试在布局本身中使用#content_for 定义它,但这只会导致文本加倍​​。我也试过了:

<%= (yield :page_title) or default_page_title %>

#default_page_title 是一个视图助手。

这只是让块完全空了。

【问题讨论】:

    标签: ruby-on-rails ruby yield


    【解决方案1】:

    此处为 rails 3 提供更好的答案:

    Yield and default case || do not output default case

    &lt;%= yield(:title).presence || 'My Default Title' %&gt;

    【讨论】:

      【解决方案2】:

      从 Rails 3 开始,yield() 如果请求的键没有内容,则返回空字符串,因此您可以执行以下操作:

      <title><%= yield(:page_title).presence || 'Default Page Title' %></title>
      

      在您的应用程序助手中,如果您定义:

      def page_title(title = nil)
        title ? content_for(:page_title) { title } : content_for(:page_title).presence
      end
      

      然后你可以这样做:

      <title><%= page_title or 'Default Page Title' %></title>
      

      在您的视图中,您可以自定义:

      <% page_title 'My Page Title' %>
      

      【讨论】:

        【解决方案3】:

        我刚刚发布了一个新的 gem,dry_views,它提供了增强的 content_for 方法。

        相对于已接受答案的好处是它允许您从视图中删除所有逻辑(如果/否则)。

        有关详细示例,请参阅自述文件:

        - no_content_for :key

        • 使用破折号 (-) 不等于 (=)
        • 将阻止稍后的 content_for 呈现。这允许模板覆盖布局。

        = content_for_with_default :key

        • 使用等号 (=) 而不是破折号 (-)
        • 您通过一个块为它提供默认 HAML,这些参数与您传递给标准“渲染”调用的参数集相同(即:partial => 'foo', :locals => {:bar => 'bar'}).`

        = content_for :key

        • 使用等号 (=) 而不是破折号 (-)
        • 您为其提供一个块,即 {render :partial => 'foo'},它将覆盖 content_for_with_default。它与 no_content_for 具有相同的优先级,因此先渲染的优先,因此如果布局具有 no_content_for 或 content_for(有或没有默认值),模板现在可以覆盖它。

        【讨论】:

          【解决方案4】:

          您可以使用content_for? 来检查是否有具有特定名称的内容:

          <% if content_for?(:page_title) %>
            <%= yield(:page_title) %>
          <% else %>
            <%= default_page_title %>
          <% end %>
          

          <%= content_for?(:page_title) ? yield(:page_title) : default_page_title %>
          

          然后在你的视图中你可以指定内容像

          <% content_for :page_title do %>
              Awesome page
          <% end %>
          

          【讨论】:

          • content_for?(:title) || 'This is a default title' 更短且有效;)也是如此: content_for :page_title, 'Awesome Page'
          • &lt;%= yield(:title).presence || 'Default Title' %&gt; 是更好的解决方案。
          猜你喜欢
          • 2013-02-26
          • 2021-06-06
          • 2015-06-05
          • 1970-01-01
          • 2011-12-02
          • 2011-12-22
          • 1970-01-01
          • 2023-03-29
          • 2015-11-07
          相关资源
          最近更新 更多