Rails ตรวจสอบว่า yield: area ถูกกำหนดใน content_for หรือไม่


97

ฉันต้องการทำการเรนเดอร์ตามเงื่อนไขที่ระดับเลย์เอาต์ตามเทมเพลตจริงที่กำหนดไว้content_for(:an__area)มีความคิดอย่างไรที่จะทำให้เสร็จ


ดูคำตอบของฉันสำหรับการสร้างวิธีการช่วยเหลือเพื่อสรุปพฤติกรรมนี้ใน Rails 3
tristanm

คำตอบ:


217

@content_for_whateverเลิกใช้แล้ว ใช้content_for?แทนดังนี้:

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

16
ตัวช่วยcontent_for?มีอยู่ใน Rails 3 เท่านั้นใน Rails 2 คุณสามารถใช้@content_for_...ตัวแปรอินสแตนซ์ได้
เกรงว่า

10

ไม่จำเป็นต้องสร้างวิธีการช่วยเหลือ:

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

แน่นอนในมุมมองของคุณ:

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

ฉันใช้สิ่งนี้ตลอดเวลาเพื่อไประหว่างหนึ่งคอลัมน์และสองคอลัมน์แบบมีเงื่อนไข



2

สามารถสร้างตัวช่วย:

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

ฉันเห็นด้วย @eirikir ไม่แน่ใจว่าตัวเองอายุน้อยกว่า 6 ปีของฉันคิดอย่างไร ฉันกำลังขยายความและทิ้งคำตอบไว้สำหรับผู้ที่ยังอยู่ใน Rails 2 .. โดยไม่ต้องมีคำนำหน้าโดยไม่จำเป็น;)
Nick

1

โอเคฉันจะตอบกลับเองอย่างไร้ยางอายเพราะไม่มีใครตอบและฉันก็ได้พบคำตอบแล้ว :) กำหนดวิธีนี้เป็นวิธีการช่วยเหลือทั้งใน 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)คือค่อนข้างดีกว่าแทนที่จะทดสอบว่าเป็นศูนย์ จุดที่ใหญ่กว่าประการที่สองตัวแปร content_for instance ถูกเลิกใช้งานดังนั้นโซลูชันของคุณจึงไม่ใช่ข้อพิสูจน์ในอนาคต
Dave Nolan

1

ฉันไม่แน่ใจเกี่ยวกับผลกระทบด้านประสิทธิภาพของการเรียกให้ผลตอบแทนสองครั้ง แต่สิ่งนี้จะเกิดขึ้นโดยไม่คำนึงถึงการนำผลตอบแทนไปใช้ภายใน (@content_for_xyz เลิกใช้แล้ว) และไม่มีรหัสเพิ่มเติมหรือวิธีการช่วยเหลือใด ๆ :

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.