Rails check if yield :area is defined in content_for

后端 未结 6 1214
我寻月下人不归
我寻月下人不归 2020-12-22 22:23

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?

相关标签:
6条回答
  • 2020-12-22 22:42

    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 %>
    
    0 讨论(0)
  • 2020-12-22 22:43

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

    <% if content_for?(:whatever) %>
      <div><%= yield(:whatever) %></div>
    <% end %>
    
    0 讨论(0)
  • 2020-12-22 22:48
    <%if content_for?(:content)%>
      <%= yield(:content) %>
    <%end%>
    
    0 讨论(0)
  • 2020-12-22 22:56

    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 %>
    
    0 讨论(0)
  • 2020-12-22 22:59

    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
    
    0 讨论(0)
  • 2020-12-22 23:02

    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

    0 讨论(0)
提交回复
热议问题