Rails 컨트롤러에서 자바스크립트 실행하기

조회수 2933회

안녕하세요. 저는 ruby on rails로 서버를 개발하고있는 학생입니다! 현재 rails가 우분투에서 production mode로 돌아가고 rails-api gem을 이용하여 rails를 오직 api서버로만 이용하고 있습니다. 모든통신은 ajax콜로 json으로 통신하는 상황입니다.

Rails controller 자체에서 javascript를 실행시킬 수 있는 방법이 있나요?

render js: "alert('TEST');" 를 해보았더니 javascript 부분이 pre 태그로 감싸여지면서

<pre style="word-wrap: break-word; white-space: pre-wrap;">alert('TEST');</pre>

이런식으로 결과물이 나옵니다.

rails 자체에서 front로 javascript를 실행 하게 하고싶은데 방법이 없을까요?? 답변주시면 감사드리겠습니다!

4 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    CKEditor를 써본 적은 없지만 검색을 해보니 <script type='text/javascript'>alert('테스트');</script>와 같은 식으로 응답을 하면 되는 것 같습니다.

    controller에서 이렇게 응답을 주도록 테스트해보세요.

    render plain:"<script type='text/javascript'>alert('테스트');</script>"
    

    참고: http://www.spacek.xyz/mle/?p=284

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • Ruby on Rails 4.2.6에 rails-api gem을 설치해서 테스트해봤는데 pre 태그 없이 alert('TEST');가 제대로 리턴됩니다. 참고로 저는 rails-api new my-api를 실행하여 애플리케이션을 생성하였습니다.

    이 문제와는 별도로 RoR에서 server side javascript를 실행하는 방법은 다음과 같습니다.

    • Built-in Helper

    form_forlink_to에 remote: true 옵션을 주면 form submit이나 링크 클릭 시 ajax 요청을 하게 되고 서버에서 js 형식으로 응답을 하면 javascript가 실행됩니다. 링크 클릭 시 alert를 띄우려면 다음과 같이 하면 됩니다.

    index.html.erb

    <%= link_to '클릭하세요', '/test/alert', remote: true %>
    

    test/alert.js.erb

    alert('테스트');
    

    참고: http://guides.rubyonrails.org/working_with_javascript_in_rails.html

    • jQuery의 $.getScript 함수 사용

    javascript에서 서버에 ajax요청을 한 후 스크립트를 실행하게 됩니다. 이 방식도 역시 서버에서 js 형식으로 응답해야 합니다.

    index.html.erb

    <script>
      function testAlert() {
        $.getScript("/test/alert", function (data, textStatus, jqxhr) {
          console.log(data); // Data returned
          console.log(textStatus); // Success
          console.log(jqxhr.status); // 200
          console.log("Load was performed.");
        });
      }
    </script>
    
    <%= link_to '클릭하세요', '#', onclick: 'javascript:testAlert();' %>
    

    test/alert.js.erb

    alert('테스트');
    

    참고: https://api.jquery.com/jquery.getscript/

    그리고, controller에서 render js: "alert('테스트');"를 해도 되지만 별도 파일로 관리하는 것을 추천합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • alert('Test"); 가 제대로 리턴된다는 말은 alert 구문이 바로 실행된다는 뜻인가요? 김진혁 2016.4.20 14:42
    • 아니요 pre tag 없이 리턴된다는 말이고 실행을 하려면 jQuery의 getScript 함수를 사용하거나 Rails의 built-in helper를 사용해야 합니다. 알 수 없는 사용자 2016.4.20 17:52
    • 감사합니다정말!!! . 한가지 더 질문하고싶은데 밑에다가 쓰면되나요??... 김진혁 2016.4.20 22:51
  • 아 getScript 라는 함수를 사용해야하군요. 제 Rails 에는 view 가 없기때문에 helper를 쓸수 없습니다. 정말 감사드립니다..!

    하나만 더 여쭈어봐도 될까요?

    현재 저는 위지윅에디터중 하나인 CKEDITOR를 붙여 이미지업로드를 구현하고 싶습니다. ckeditor에서는 front 부분에서 이미지 업로드를 처리할 path 를 설정하면 그 path로 이미지 정보가 전달됩니다. 그 route에서 설정한 path를 따라 제가 만든 어떤 액션이 실행될것입니다.

    그런데 ckeditor에서는 제가 만든 이 어떤 액션에서 처리를 한 후 이 액션에서 처리된 결과를 이용하여 특정한 자바스크립트 함수를 실행해야 이미지 업로드가 완료됩니다.

    <script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction('콜백의 식별 ID 값', '파일의 URL', '전송완료 메시지')</script>
    

    이런 자바스크립트 함수를 콜백으로 실행해야 합니다. 그런데 jQuery 의 getScript를 함수를 이용하여 이미지통신이 완료되면 render js로 자바스크립트 데이터를 얻어와 콜백으로 구현하면되지만, ckeditor 자체에서 구현한 자바스크립트 내용들로 이루어져있고 전부 compressed 되있기 때문에, 어느부분에서 이미지 전달 통신이 이루어지는지 제가 찾아서 고치기는 불가능한 상황인거 같습니다.

    제 rails는 api서버로만 써서 view가 없습니다. 너무 질문이 두서없었는데요.. 죄송합니다.

    대충정리한다면, rails api로 이루어진 서버에서 특정 서버에서 처리한내용을 가진 자바스크립트를 프런트에서 실행시켜야 하는데 , 프런트 자바스크립트에서 이미지 업로드를 위한 함수가 실행되면 콜백으로 데이터를 받아서 실행시키면 되지만, 이런 이미지 업로드를 위한 함수가 무엇인지 찾기가 힘든상황입니다.

    api서버로 이용하지않고 특정 js 파일로 랜더링을 시켜서 자바스크립트를 실행하게 했으면 간단한문제였을것같습니다...

    이 상황에 혹시 다른어떤 방법이 있을까요?

  • render plain:"<script type='text/javascript'>alert('테스트');</script>"
    

    을 하여 응답을 하면 이런식으로 됩니다. 이미지 이름이나 설명을 여기에 넣어주세요.

    이미지를 선택해서 서버로 전송하면 이 사진과 같이 자바스크립트가 실행이 되지 않고, script text내용이 iframe 에 감싸여지면서 text로 출력이됩니다.

    ..계속질문해서 죄송합니다..ㅜㅜ 어디가 잘못된것일까요?..

    render js: 로 응답을해도 결과는 같은 상황입니다.

    • render text: 로 하니까 해결되었습니다! 감사드립니다.!!! 김진혁 2016.4.22 00:03

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)