2010-04-14 2 views
53

양식에 새 필드를 추가하는 jQuery 스크립트가 있으며이 필드에는 배열의 동적 정보가 들어 있습니다. 문제는 HAML 들여 쓰기를 깨지 않고 오류를 발생시키지 않고 javacript 내에서 select 필드의 옵션을 채우는 array.each를 추가하는 방법을 알 수 없다는 것입니다. HAML 내의 Javascript 내 루비 메소드

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>); 
)}; 

은 또한 그것을 시도 : 행운과 자바 스크립트 필터

다음은 작동하지 않습니다 최선 시도이다.

+0

감사합니다. 누군가 나를 위해 Markdown 들여 쓰기 문제를 고쳤습니다. – Josh

답변

96

일반적으로 haml에서 통증이있는 ​​경우, 까다로운 부분을 도우미 또는 부분으로 리팩토링하고이를 호출해야 함을 의미합니다. 당신을 위해 스크립트 태그에 넣어 들여 쓰기를 허용하기 때문에

// some_helper.rb 
def new_snazzy_select_tag(options = []) 
    select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } 
end 

또한, 당신은 자바 스크립트를 렌더링 할 :javascript 필터를 사용해야합니다.

마지막으로 :javascript 필터를 포함하여 haml의 모든 위치에 #{ruby_expression}을 사용할 수 있습니다. 이는 html 요소의 내용이 아닌 곳으로 루비 표현식의 결과를 출력해야 할 때 매우 편리합니다. 당신을 가정, 그러나

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - @myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>'); 
)}; 

실행중인 :

// some_view.html.haml 
:javascript 
    $('#mylink').click(function() { 
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); 
    }; 
+0

나는 웹 애플 리케이션 개발에 익숙하지 않은, 도우미 사용에 대해 생각해 본 적이 없다. 내 코드를 MVC에 가깝게 유지했지만 항상 뷰에서 필요한 루프를 처리하는 방법을 궁금해했습니다. 그것은 잘 작동합니다. 답변 감사합니다. – Josh

+4

헬퍼는 일반적으로 뷰와 컨트롤러 사이의 중간에 있습니다. 서버 측 상태를 절대로 변경해서는 안되며 불쾌한 뷰 로직으로 * 도움을 줄 수 있습니다. 루비는 명확하고 유지 보수가 가능한 한 최소한으로해야합니다. 도우미가 도와줍니다. –

+6

TL; DR ...? # {ruby_expression} 사용 알렉스 고마워. – umassthrower

8

이 시도, 그것은 (내가 다섯 번째 줄에 하나의 공간을 제거하고 여섯 번째에 닫는 따옴표를 추가했다 않았다 모두가) 작동합니다 루비 스크립트 나 프레임 워크를 사용하여 왜 템플릿 밖에서하지 않습니까? 아마도 가장 적절할 것입니다. 레일/sinatra 및 다른 프레임 워크에서는이를 수행하는 도우미 메서드를 사용할 수 있습니다. haml 참조를 보면 실제로는 -을 사용하여 루비를 평가하지 못하게합니다.

+0

구문 형광펜을 사용하지 않고 메모리에서 코드를 입력했지만 몇 가지 오류가있는 것 같습니다. 나는 지금 시험 할 수는 없지만, 아직도 실패 할 것이라고 믿는다. 나는 전에 생각하지 못했던 도우미 루트로 갈 것입니다. 고맙습니다. – Josh

+0

저는 이전에 빠른 sinatra 앱에서 저의 답안으로 작성한 코드를 테스트 해 보았습니다. 제대로 작동하는 것 같았습니다. 그 오류는 다른 곳에 없다는 것이 확실합니까? 다음은 임의의 옵션 ID와 이름을 사용하여 생성 된 출력입니다. http://pastie.org/920686 – ehsanul

관련 문제