Rails 3:yield/content_for有一些默认值?

d11*_*wtq 59 ruby yield ruby-on-rails

有没有办法检测是否#content_for实际应用于yieldRails中的作用域?

一个典型的例子是:

<title><%= yield :page_title %></title>
Run Code Online (Sandbox Code Playgroud)

如果模板没有设置

<% content_for :page_title, "Something here" %>
Run Code Online (Sandbox Code Playgroud)

有没有办法让布局把其他东西放在那里?

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

<%= (yield :page_title) or default_page_title %>
Run Code Online (Sandbox Code Playgroud)

#default_page_title视图帮助器在哪里.

这只是让街区完全空了.

Dyl*_*kow 120

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

<% if content_for?(:page_title) %>
  <%= yield(:page_title) %>
<% else %>
  <%= default_page_title %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

要么

<%= content_for?(:page_title) ? yield(:page_title) : default_page_title %>
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以指定内容

<% content_for :page_title do %>
    Awesome page
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • `<%= yield(:title).presence || '默认标题'%>`是更好的解决方案. (4认同)
  • content_for?(:title)|| '这是一个默认标题'更短并且有效;)以及:content_for:page_title,'Awesome Page' (2认同)

Jos*_*ady 13

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

<title><%= yield(:page_title).presence || 'Default Page Title' %></title>
Run Code Online (Sandbox Code Playgroud)

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

def page_title(title = nil)
  title ? content_for(:page_title) { title } : content_for(:page_title).presence
end
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

<title><%= page_title or 'Default Page Title' %></title>
Run Code Online (Sandbox Code Playgroud)

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

<% page_title 'My Page Title' %>
Run Code Online (Sandbox Code Playgroud)


cyr*_*ier 6

Rails 3 的更好答案在这里:

收益率和违约情况 || 不输出默认情况

<%= yield(:title).presence || 'My Default Title' %>


Pet*_*ing 5

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

对已接受的答案的好处是它允许您从视图中删除所有逻辑(if/else).

有关大量示例,请参阅自述文件:

- no_content_for :key

  • 使用短划线( - )不等于(=)
  • 将阻止以后的content_for呈现.这允许模板覆盖布局.

= content_for_with_default :key

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

= content_for :key

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