컨트롤러에서 JSON 렌더링
책을 읽고 있었는데 컨트롤러에 관한 장에서 렌더링에 대해 언급하고 있는데, JSON의 경우 다음과 같은 예가 있지만 자세한 내용은 설명하지 않았기 때문에 이 예가 더 큰 그림을 그릴 수 없었습니다.
render :json => @projects, :include => tasks
또한 콜백 함수와 함께 사용하는 JSONP의 예를 다음에 나타냅니다.
render :json => @record, :callback => 'updateRecordDisplay'
누가 설명 좀 해줄래?
일반적으로 JSON을 반환하는 이유는 다음과 같습니다.
A) 어플리케이션의 일부 또는 전부를 단일 페이지 어플리케이션(SPA)으로 빌드하고 있으며 페이지를 완전히 새로고침하지 않고 추가 데이터를 가져올 수 있도록 클라이언트 측 JavaScript가 필요합니다.
또는
B) 서드파티가 사용하는 API를 구축하고 있으며 JSON을 사용하여 데이터를 시리얼화하기로 결정했습니다.
아니면, 아마도, 당신은 자신의 개 사료를 먹고 둘 다 하고 있을 것이다.
어느 경우든render :json => some_data
JSON은 제공된 데이터를 확인합니다.그:callback
두 번째 예의 키는 좀 더 설명이 필요하지만(아래 참조), 동일한 아이디어의 또 다른 변형입니다(JavaScript가 쉽게 처리할 수 있는 방식으로 데이터를 되돌립니다).
왜죠:callback
?
JSONP(두 번째 예)는 모든 브라우저에 내장된 보안의 일부인 동일한 오리진 정책을 회피하는 방법입니다.API가 있는 경우:api.yoursite.com
그리고 당신은 당신의 지원서를 다음 날짜로 보내게 될 것입니다.services.yoursite.com
JavaScript는 (기본값으로) 할 수 없습니다.XMLHttpRequest
(XHR - aka ajax)로부터의 요구services
로.api
이 제한을 회피하는 방법(원래 자원 공유 사양이 확정되기 전)은 JSON이 아닌 JavaScript인 것처럼 서버에서JSON 데이터를 전송하는 것입니다.따라서, 다음의 내용을 반송하는 것이 아니라,
{"name": "John", "age": 45}
서버는 대신 다음과 같이 회신합니다.
valueOfCallbackHere({"name": "John", "age": 45})
따라서 클라이언트 측 JS 어플리케이션으로 인해script
가리키는 태그api.yoursite.com/your/endpoint?name=John
또,valueOfCallbackHere
함수(클라이언트측 JS에서 정의해야 함)는 이 다른 발신기지에서 데이터를 사용하여 호출됩니다.
정확히 무엇을 알고 싶으세요?Active Record에는 레코드를 JSON으로 시리얼화하는 메서드가 있습니다.예를 들어 레일 콘솔을 열고ModelName.all.to_json
JSON 출력이 표시됩니다. render :json
본질적으로 전화하다to_json
는 올바른 헤더를 가진 브라우저로 결과를 반환합니다.이것은 JavaScript에서 사용할 JavaScript 개체를 반환하는 AJAX 호출에 유용합니다.또, 를 사용할 수 있습니다.callback
옵션을 사용하여 JSONP를 통해 호출할 콜백의 이름을 지정합니다.
를 들어, 우리가 , 하다, 하다,User
:{name: 'Max', email:' m@m.com'}
다음과 같은 컨트롤러도 있습니다.
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
여기서 jQuery를 사용하여 AJAX 콜을 실행하면 다음과 같이 됩니다.
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
보시다시피 id가 5인 사용자를 rails 앱에서 가져와 자바스크립트 코드로 사용할 수 있었습니다.이는 JSON 오브젝트로 반환되었기 때문입니다.콜백 옵션은 JSON 개체와 함께 전달된 이름의 JavaScript 함수를 첫 번째 유일한 인수로서 호출합니다.
, 「 」의 예를 나타냅니다.callback
이치노
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
이제 다음과 같이 JSONP 요청을 작성할 수 있습니다.
function testFunction(data) {
alert(data.name); // Will alert Max
};
var script = document.createElement("script");
script.src = "/users/5";
document.getElementsByTagName("head")[0].appendChild(script);
이러한 콜백을 사용하는 동기는 일반적으로 크로스 오리진 자원 공유(CORS)를 제한하는 브라우저 보호를 회피하기 위한 것입니다.다만, 보다 안전하고 간단하게 CORS를 회피하는 다른 기술이 존재하기 때문에, JSONP는 그다지 많이 사용되지 않게 되었습니다.
의 예로서
render :json => @projects, :include => :tasks
''는.@projects
JSON, JSON의 합니다.tasks
이치노
의 예로서
render :json => @projects, :callback => 'updateRecordDisplay'
''는.@projects
JSON의 javascript.
updateRecordDisplay({'projects' => []})
이를 통해 데이터를 상위 창으로 전송하고 사이트 간 위조 문제를 우회할 수 있습니다.
언급URL : https://stackoverflow.com/questions/14824551/rendering-json-in-controller
'code' 카테고리의 다른 글
Dockerfile 다운로드 및 압축 해제 방법 (0) | 2023.02.18 |
---|---|
Oracle 날짜 "Between" 쿼리 (0) | 2023.02.16 |
'오류: [$parse:lexerr] 렉서 오류:heroku 전개 시 예기치 않은 다음 캐릭터' (0) | 2023.02.16 |
각도 방향에서 부울 값을 바인딩하려면 어떻게 해야 합니까? (0) | 2023.02.16 |
jq를 사용하여 요소 속성 값으로 개체 배열을 필터링하려면 어떻게 해야 합니까? (0) | 2023.02.16 |