Rails 检查是否在 content_for 中定义了 Yield:area

发布于 2024-07-07 06:52:34 字数 78 浏览 10 评论 0原文

我想根据实际模板定义的 content_for(:an__area) 在布局级别进行条件渲染,知道如何完成此操作吗?

I want to do a conditional rendering at the layout level based on the actual template has defined content_for(:an__area), any idea how to get this done?

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

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

发布评论

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

评论(7

我三岁 2024-07-14 06:52:34

@content_for_whatever 已弃用。
使用 content_for? 代替,如下所示:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>

@content_for_whatever is deprecated.
Use content_for? instead, like this:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
a√萤火虫的光℡ 2024-07-14 06:52:34

并不是真的有必要创建一个辅助方法:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

那么当然在你看来:

<% content_for :sidebar do %>
  ...
<% end %>

我一直使用它来有条件地在一列和两列布局之间切换

not really necessary to create a helper method:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

then of course in your view:

<% content_for :sidebar do %>
  ...
<% end %>

I use this all the time to conditionally go between a one column and two column layout

薄荷港 2024-07-14 06:52:34
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
假装爱人 2024-07-14 06:52:34

可以创建一个助手:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

并在您的布局中使用它:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

Can create a helper:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

And use this in your layout:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
素染倾城色 2024-07-14 06:52:34

好吧,我要无耻地做一个自我回复,因为没有人回答,而我已经找到了答案:)
在 application_helper.rb 中或您认为方便的任何地方将其定义为辅助方法。

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end

Ok I am going to shamelessly do a self reply as no one has answered and I have already found the answer :)
Define this as a helper method either in application_helper.rb or anywhere you found convenient.

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end
左耳近心 2024-07-14 06:52:34

我不确定调用yield两次对性能的影响,但是无论yield的内部实现如何(@content_for_xyz已弃用)并且没有任何额外的代码或辅助方法,这都会起作用:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

I'm not sure of the performance implications of calling yield twice, but this will do regardless of the internal implementation of yield (@content_for_xyz is deprecated) and without any extra code or helper methods:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
中性美 2024-07-14 06:52:34

在检查视图中是否存在内容之前,我使用 @view_flow 和 content 方法的值,如下所示:

@view_flow.content[:header_left_or_whatever_the_name_of_your_block_is].present?

最近在使用 byebug 在控制台中显示 self 的所有本地、全局和实例变量时偶然发现了它。 我是使用它的粉丝,因为它直接来自 Rails,不会抛出错误,不会隐藏任何“Rails 魔法”,返回明确的 true 或 false,+仅检查视图当前上下文中的内容正在渲染。

@view_flow 是 ActionView::Context 的实例属性,因为 Action View 上下文提供给 Action Controller 来渲染模板,它将可用于任何由 Rails 渲染的视图。 尽管它会检查内容,但如果内容不存在,则不会生成 content_for 块。 所以这是我在类似情况下的完美解决方案。

I use @view_flow and value of the content method before checking if the content is present in the view like this:

@view_flow.content[:header_left_or_whatever_the_name_of_your_block_is].present?

Recently stumbled upon it when showing all local, global and instance variables of self in the console with byebug. I’m a fan using this because it’s straight from Rails, won’t throw an error, won’t hide anything w “Rails magic”, returns a definite true or false, + only checks the content in the current context of the view being rendered.

@view_flow is an instance attribute of ActionView::Context and because Action View contexts are supplied to Action Controller to render a template it will be available to any view that has been rendered by Rails. Although it checks for content, the content_for block will not be yielded if it isn’t there. So it’s been my perfect solution in similar situations.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文