programing

레일 3의 JS/ERB 템플릿에서 JSON 처리

padding 2023. 3. 19. 19:54
반응형

레일 3의 JS/ERB 템플릿에서 JSON 처리

JSON 오브젝트 및 jQuery-rails(jQuery 라이브러리 및 특수 rails.js 파일)를 사용하여 Rails(3)와 AJAX 콜을 주고받는 데 문제가 없습니다.

단, 1개의 컨트롤러에서는 AJAX 콜 후에 일부 JSON을 erb 템플릿(create.js.erb)으로 되돌리고 싶습니다.

컨트롤러(@object)의 모든 조합을 시도해 보았습니다.to_json, '[{"content""""hello world"}"] 등) 및 템플릿 자체(JSON.parse(), 작은따옴표, 큰따옴표 등)에서 객체는 계속 렌더링됩니다.

'[{"groups":{},"created_at":"2010-09-21T03:49:34Z" ...

그 결과 jQuery 코드가 해석되지 않아 오류가 발생합니다.

컨트롤러에서 객체를 준비하려면 어떻게 해야 하며 뷰에서 객체를 유효한 JSON 개체로 렌더링하려면 어떤 erb 구문이 필요합니까?

정말 고마워요!

이게 원인인지는 잘 모르겠지만, 또 다른 게임도 해보실 수도 있습니다.html_safe방법.ERB는 html이 안전하지 않다고 생각하기 때문에 JSON을 탈출하고 있을 수 있습니다.다음 문자열을 사용할 때 이 메서드를 호출해 보십시오.

@object.to_json.html_safe

사용.html_escape또는rawXSS에 취약할 수 있습니다.

대신, 의 합리적인 버전을 정의하십시오.json_escape(일명.k.a.j도우미:

module ActionView::Base
  def json_escape(s)
    result = s.to_s.gsub('/', '\/')
    s.html_safe? ? result.html_safe : result
  end

  alias j json_escape
end

다음과 같이 사용합니다.

<script>
  var Accounts = new Backbone.Collection;
  Accounts.reset(<%=j @accounts.to_json.html_safe %>);
  var Projects = new Backbone.Collection;
  Projects.reset(<%=j @projects.to_json(:collaborators => true).html_safe %>);
</script>

상세한 것에 대하여는, 투고를 참조해 주세요.

이름 짓기 충돌이 있음을 유의하십시오.j에 일가견이 있는.json_escapeERB:: 용도 및j에 일가견이 있는.escape_javascript[ Action View ] :: 도우미:JavaScript Helper.JavaScriptHelper 에일리어스의 이름을 다음과 같이 변경했으면 합니다.js.

되돌아가다json다음과 같이 컨트롤러에 렌더링을 기록해야 합니다.

render :json => @object

및 그.to_json자동으로 호출됩니다.

일부 관계를 포함할 경우 다음을 수행할 수 있습니다.

render :json => @post.to_json(:include => [:comments, :authors])

당신의 json을 렌더링하기 위해 erb를 사용하는 것이 효과가 있을지 모르겠습니다.

컨트롤러로 렌더를 호출할 수 있지만 핸들러에 의한 후속 dom 삽입을 위해 여러 부분을 렌더링해야 할 경우 문제가 발생합니다.여러 html fragment를 해시에 설정할 필요가 있었습니다.이 erb는 위에서 neutrino가 제시한 바와 같이 기본적으로 hash.to_json.safe를 사용하여 프로세스에서 여러 부분을 렌더링할 수 있습니다.

오직.to_json.html_safe필요한 경우:

> `'<script>'.to_json`
=> "\"\\u003cscript\\u003e\""

작성하는 패치to_json반응하다html_safe?및 반환true자동:

# just use .to_json instead of .to_json.html_safe
ActiveSupport::JSON.class_eval do
  class << self
    def encode_with_html_safe *args
      self.encode_without_html_safe(*args).html_safe
    end
    alias_method_chain :encode, :html_safe
  end
end

언급URL : https://stackoverflow.com/questions/3757457/handling-json-in-js-erb-template-in-rails-3

반응형