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
Helper 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
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%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

나는 6 살 어린 내 자신이 무엇을 생각하고 있는지 잘 모르겠지만 @eirikir에 동의합니다. 나는 불필요한 프리앰블없이 Rails 2 ..에있는 사람들을 위해 내 대답을 연장하고 남겨두고있다;)
Nick

1

Ok 나는 아무도 대답하지 않았고 이미 대답을 찾았 기 때문에 뻔뻔하게 자기 회신을 할 것입니다. :) 이것을 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)은 0인지 아닌지 테스트하는 것보다 약간 깔끔합니다. 솔루션 미래 증명되지 않도록 두 번째로 큰 포인트는 content_for 인스턴스 변수가되지 않습니다
데이브 놀란

1

yield를 두 번 호출하는 것이 성능에 미치는 영향은 확실하지 않지만 yield의 내부 구현 (@content_for_xyz는 더 이상 사용되지 않음)에 관계없이 추가 코드 나 도우미 메서드없이 수행됩니다.

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.