2012-05-13 3 views
2

내 응용 프로그램에서 사용자가 잠재적으로 안전하지 않은 주석을 입력하도록했습니다.컨트롤러에서 Javascript로 HTML을 전달하는 적절한 방법은 무엇입니까?

<%= simple_format h annotation.body %> 

그것은 줄 바꿈을 보존뿐만 아니라 제대로 HTML을 탈출 : 내보기에서 렌더링 할 때, 다음과 멋지게 주석을 보여줍니다. 이제 Javascript로 만든 오버레이에서이 본문을 렌더링해야합니다. 지금, 나는 컨트롤러에서 다음 호출하여 JSON을 통해 내 주석을 가져 오기 :

def index 
    # ... 
    respond_to do |format| 
    format.json { render :json => @annotations } 
    end 
end 

그리고이 (매우 간단한 예) 같은 오버레이 생성 : 물론

$.getJSON(this.annotations_url, function(data) { 
    $.each(data, function(key, val) { 
     annotation = val; 
     this.div_body.html(annotation.body); 
     // ... 

을, 결과 HTML을 것입니다 이 아닌은 올바르게 이스케이프 처리되고 줄 바꿈도 보존되지 않습니다.


지금, 나는 그렇게하면 내가 많이 건조되지 않을 것 같은이 느낌 때문에 이스케이프 라인 브레이크 변환을 수행하는 순수 자바 스크립트를 사용하여 같은 느낌하지 않습니다. 전체 코드를 관리하고 복잡하게 만드는 것은 어렵습니다.

컨트롤러에서 JSON을 통해 안전한 HTML 본문을 어떻게 보낼 수 있습니까? ERB simple_formath 메소드는보기에서만 사용할 수있는 것처럼 보입니다.

또는 Javascript로 모든 것을 정말로 수행해야합니까?

답변

1

난 당신이 모든 단지 그들의 긴 이름을 호출하는 곳 helpers를 사용할 수 있다고 생각 :

ActionController::Base.helpers.simple_format str
ERB::Util:: html_escape str

당신은 이미 구문 분석 된 버전을 포함하는 당신이 customize your Model.to_json behavior을 할 수있는이 일단 모델

을에서보기 동작을 추가하여 모델

  • 에서

    1. 레일 의존하지만 가끔은 더 가져오고 이러한 문제를 피하려고 : 물론

      이이 방법에 문제가있다 복잡성보다 명확합니다.

  • +0

    이 코드는 매우 효과적입니다. 코드를 렌더링하기 전에'format.json' 블록에 추가했습니다. 지금 컨트롤러에 있지만 JS에서 수행하는 것보다 나은 점이 있습니다. – slhck

    0

    html과 마찬가지로 erb 템플릿에서 JSON을 반환 할 수 있습니다. 컨트롤러에서 JSON을 반환하는 대신 html 응답과 마찬가지로 렌더링을하지 않아도됩니다. index.hmtl.erb 뷰의 이름을 지정하는 대신 index.json.erb이라는 이름을 지정하십시오.

    나는 이것이 가장 깨끗한 방법이라고 확신하지 못합니다. Rails가 응답 HTML 또는 기타에 대해 simple_format을 제공 한 유일한 방법입니다.

    관련 문제