2011-01-05 4 views
3

블록 도우미 내에서 몇 가지 도우미 메서드를 정의하고 있지만 블록의 범위 내에서 유지하여 합리적인 메서드 이름을 가질 수 있으며 더 깨끗하게 보입니다. 추가 범위 메서드에 대한 레일 도우미에 범위가 지정된 블록을 만듭니다.

내가 내보기 사용 헬퍼에서 다음 (매우 기본적인 예)하고 싶은 말 :

<%= foo_box do |b| %> 
    <%= b.title('Foo Bar') %> 
    Lorem Ipsum... 
<% end %> 

나는 또한 bar_box을 가질 수

<div class="foo_box"> 
    <h2>Foo Bar</h2> 
    Lorem Ipsum... 
</div> 

이런 식으로 뭔가를 생산하기 블럭 도우미는 title 메서드를 가지고 완전히 다른 것을 출력 할 수 있습니다.

현재 나는 다른 방법으로 구현했습니다. foo_boxfoo_box_title,과 같이 블록을 처리 foo_box로 :

def foo_box(&block) 
    content_tag(:div, capture(&block), :class => 'foo_box') 
end 

답변

4

을 그것의 모습으로 capture 당신은 당신이 원하는 블록에 인수를 통과하지 않습니다. 베이스 (b)의 인수는 title 등의 메소드를 정의하는 일종의 객체 여야합니다. 그래서, 당신이 필요로하는 물건을 출력 할 헬퍼 클래스를 정의하고, 그것을 뷰에서 전달 된 블록으로 전달한 다음, 캡쳐 한 다음 위에서 설명한대로 div으로 둘러 쌉니다.

class FooBoxHelper 
    include ActionView::Helpers::TagHelper 
    def title(text) 
    content_tag(:h2, text) 
    end 
    def small(text) 
    content_tag(:p, text, :class => "small") 
    end 
end 

def foo_box(&block) 

    new_block = Proc.new do 
    helper = FooBoxHelper.new 
    block.call(helper) 
    end 
    content_tag(:div, capture(&new_block), :class => 'foo_box') 
end 

나는 capture 방법의 제한을 해결 있었는지를 참조하십시오 :이 같은 일을 할 것인가? 새로운 Proc를 현재 스코프에 바인딩하고 거기서 도우미 객체를 전달함으로써 인수없이 호출 할 수있는 블록을 얻습니다. 따라서 capture까지 수용 할 수 있습니다. 또한 도우미 클래스가 ActionView::Helpers의 모든 관련 도우미 메서드를 포함하는지 확인하십시오. 희망이 도움이!

+0

감사합니다. – DEfusion

관련 문제