2013-07-10 2 views
2

저는 Sinatra 앱에서 일하고 있으며 내 폼 도우미를 작성하려고합니다. 그런 다음actionview없이 form_tag 도우미를 구현하는 방법은 무엇입니까?

<% form_helper 'action' do |f| %> 
    <%= f.label 'name' %> 
    <%= f.field 'name' %> 
    <%= f.button 'name' %> 
<% end %>  

나는 FormBuilder 클래스를 생성 할 수 있습니다 내 단순화 된 형태로 도우미와 같은 ERB 블록에 방법을 얻을 : 내 ERB 파일에서 나는 레일 2.3 스타일의 구문을 사용하고 form_helper 방법으로 블록을 전달하려면 그래서 다음 <form></form> 태그를 둘러싸고있는 방법을 출력 이해가 안 무엇

module ViewHelpers 
    class FormBuilder 
    def label(name) 
     name 
    end 
    def field(name) 
     name 
    end 
    def button(name) 
     name 
    end 
    end 
    def form_helper(action) 
    form = FormBuilder.new 
    yield(form) 
    end 
end  

이다. 첫 번째 및 마지막 <%= f.___ %> 태그에만 텍스트를 추가 할 수 있습니까?

+0

[** Padrino의 폼 헬퍼 및/또는 빌더 **] (http://www.padrinorb.com/guides/application-helpers#form-he)를 사용하는 것이 좋습니다. lpers) 대신에 자신의 롤링. 이 젬은 독립 실행 형 플러그인으로 제공되며 모든 Ruby 프레임 워크와 함께 사용할 수 있습니다. –

+0

Padrino, 또는 그 부분을 사용하는 것은 정말 좋은 제안이며, 나는 그 길을 갈 수도 있습니다. 나는 대부분 어떻게 사물들이 어울리는지를 확실히 알고 싶었습니다. – llnathanll

답변

2

레일즈는 블록 헬퍼가 원하는대로 작동하도록하기 위해 몇 가지 트릭을 사용해야하고, 레일 2에서 레일즈 3로 변경되었습니다 (자세한 내용은 블로그 게시물 Simplifying Rails Block HelpersBlock Helpers in Rails 3 참조).

헬기 (레일즈 2.3)는 directly writing to the output buffer from the method에 의해 레일 concat 메서드를 사용합니다. Sinatra에서 비슷한 일을하기 위해서는 같은 방법으로 도우미의 결과물에 글을 쓰는 방법을 찾아야합니다.

Erb는 변수에 출력을 빌드하는 루비 코드를 생성하여 작동합니다. 또한이 변수의 이름을 설정할 수 있습니다. 기본값은 _erbout (또는 Erubis에서는 _buf)입니다. 이 변수를 로컬 변수가 아닌 인스턴스 변수로 변경하면 (예 : @으로 시작하는 변수 이름을 제공) 도우미에서 액세스 할 수 있습니다. (Rails는 @output_buffer이라는 이름을 사용합니다).

Sinatra는 렌더링 템플릿 용으로 Tilt을 사용하고, Tilt는 Erb 또는 Erubis 템플릿에서 변수 이름을 설정하기 위해 :outvar 옵션을 제공합니다. 여기

이것이 어떻게 작동하는지의 예 :이 (매우 간단) 예와

# set the name of the output variable 
set :erb, :outvar => '@output_buffer' 

helpers do 
    def form_helper 
    # use the new name to write directly to the output buffer 
    @output_buffer << "<form>\n" 

    # yield to the block (this is a simplified example, you'll want 
    # to yield your FormBuilder object here) 
    yield 

    # after the block has returned, write any closing text 
    @output_buffer << "</form>\n" 
    end 
end 

,이 같은 ERB 템플릿 : 생성 된 HTML에서

<% form_helper do %> 
    ... call other methods here 
<% end %> 

결과 :

<form> 
    ... call other methods here 
</form> 
+0

답을 주셔서 감사합니다.': outvar'를 인스턴스 변수로 설정하고 쓰는 것은 빠진 퍼즐 조각이었습니다. 나는 Tilt와 Erb를 파고 들어야 할 시간을 보내야 할 것이다. 그러나 이것은 나에게 달려있다. – llnathanll

관련 문제