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

发布于 2024-11-05 19:45:19 字数 533 浏览 3 评论 0原文

有什么方法可以检测 #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 是视图助手。

这使得该块完全空了。

Is there any way to detect if #content_for was actually applied to a yield scope in Rails?

A classic example being something like:

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

If a template doesn't set that with

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

Is there a way to have the layout put something else there instead?

I tried defining it with #content_for in the layout itself, but this just causes the text to be doubled-up. I also tried:

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

Where #default_page_title is a view helper.

This just left the block completely empty.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

千秋岁 2024-11-12 19:45:19

您可以使用 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 %>

You can use content_for? to check if there is content with a specific name:

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

or

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

Then in your views you can specify the content like

<% content_for :page_title do %>
    Awesome page
<% end %>
你的往事 2024-11-12 19:45:19

从 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' %>

As of Rails 3, yield() returns empty string if there was no content for the requested key, so you can do something like this:

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

In your application helper, if you define:

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

Then you can do something like this:

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

And in your views you can customize with:

<% page_title 'My Page Title' %>
花海 2024-11-12 19:45:19

这里有关于 Rails 3 的更好答案:

Yield and default case ||不输出默认情况

<%= Yield(:title).presence || '我的默认标题' %>

Better answer for rails 3 here:

Yield and default case || do not output default case

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

独自←快乐 2024-11-12 19:45:19

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

与接受的答案相比,它的好处是它允许您从视图中删除所有逻辑(if/else)。

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

- 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(带或不带默认值),模板现在可以覆盖它。

I have just released a new gem, dry_views, which provides enhanced content_for methods.

The benefit over the accepted answer is it allows you to remove all logic (if/else) from your views.

See the readme for extensive examples:

- no_content_for :key

  • Use a dash (-) not equals (=)
  • Will prevent a later content_for from rendering. This allows template overrides of layouts.

= content_for_with_default :key

  • Use an equal (=) not a dash (-)
  • You provide it with the default HAML via a block or a set of params that are the same as you would pass to a standard "render" call (i.e. :partial => 'foo', :locals => {:bar => 'bar'}).`

= content_for :key

  • Use an equal (=) not a dash (-)
  • You provide it with a block, i.e. {render :partial => 'foo'}, and it will override content_for_with_default. It has the same precedence as no_content_for, so whichever is rendered first wins, so if a layout has either no_content_for or content_for (with or without default) the template can now override it.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文