【问题标题】:Rails check if yield :area is defined in content_forRails 检查是否在 content_for 中定义了 yield :area
【发布时间】:2023-03-29 00:57:01
【问题描述】:

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

【问题讨论】:

  • 请参阅我的answer,了解如何在 Rails 3 中创建一个帮助方法来封装此行为。

标签: ruby-on-rails layout yield


【解决方案1】:

@content_for_whatever 已弃用。 请改用content_for?,如下所示:

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

【讨论】:

  • Helper content_for? 仅存在于 Rails 3 中。在 Rails 2 中,您可以使用 @content_for_... 实例变量。
【解决方案2】:

不需要创建辅助方法:

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

那么当然在你看来:

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

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

【讨论】:

    【解决方案3】:
    <%if content_for?(:content)%>
      <%= yield(:content) %>
    <%end%>
    

    【讨论】:

      【解决方案4】:

      可以创建助手:

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

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
      • 我同意@eirikir,不确定我 6 岁的小自己在想什么。我正在为仍在 Rails 2 上的人扩展并留下我的答案.. 没有不必要的序言;)
      【解决方案5】:

      好吧,我会无耻地做一个自我回复,因为没有人回答,我已经找到了答案:) 在 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
      

      【讨论】:

      • 呵呵,我喜欢你的自我回复,但是... 次要的一点,instance_variable_defined?(content_var_name) 比测试它是否为 nil 更简洁一些。第二大点, content_for 实例变量已被弃用,因此您的解决方案不是面向未来的
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 2015-06-05
        • 2012-01-20
        • 2011-06-03
        相关资源
        最近更新 更多