2011-06-14 9 views
0

레일즈 2.3.11 앱에서 로그온 한 사용자에게만 제공되는 파일 다운로드를 등록하려고합니다. 링크를 클릭하여 파일 (공용 디렉토리의 파일에 대한 직접 링크)을 다운로드하면 레일 앱이 메소드를 호출하도록합니다.rails link_to_function 파일 다운로드

내가 link_to_function을 사용해야한다고 생각합니다. 다운로드를 기록하기 위해 레일스에 javascript/메소드를 작성하는 것이 좋습니다.

메서드를 호출 한 후 파일 다운로드를 어떻게 계속해야하는지 모르겠습니다. 메서드 호출 (백그라운드에서)이 끝나면 파일 다운로드가 시작됩니다.

아이디어가 있으십니까?

+0

보기 및 컨트롤러의 관련 부분을 게시하십시오. – BryanH

답변

0

당신은 아마 이것을 생각하고 있습니다. Javascript가 필요 없습니다. 원하는 것은 다운로드 동작에 대한 링크이며, 다운로드 동작을 등록한 다음 파일을 다시 스트리밍합니다. Rails가 처리하지 못하도록하는 매우 큰 파일을 가지고 있지 않다면 이것은 잘 동작 할 것입니다.

다시 컨트롤러에서 이진 파일을 전송의 예 :

send_data(binary_data, :type => 'application/pdf', :filename => 'myfile.pdf', :disposition => 'inline') 

또는 더 나은 : 압둘라 Jibaly의 대답은 완벽하게 작동

render :content_type => 'application/octet-stream', :text => Proc.new { |response, output| 
    # do something that reads data and writes it to output 
} 
+0

좋아, 재미있어, 나는 그것을 밖으로 시도 할거야. 이전에는 send_data를 사용하지 않았습니다. –

0

는 자바 스크립트를 필요로하지 않는 장점이 있습니다.

이전처럼 파일을 다운로드 할 수있는 jQuery 자바 스크립트 솔루션을 구현했습니다.

내보기의 링크는 JS가 작동하려면 다운로드 클래스를 추가하는 것은 중요 : 데이터를 게시하는대로 내 컨트롤러에서 그 값을 필요로하기 때문에

<%= link_to document.type.value, document.scan.url, :popup => true, :class => "download" %> 

추가 된 자바 스크립트, 내가하는 PROPERTY_ID를 추가 :

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".download").click(function(event){ 
     $.post("/ajax/property_interested_user", { property_id: $("#property_id").html() }); 
     }); 
    }); 
    </script>