Rails에서 뷰를 사용하여 JSON을 어떻게 렌더링합니까?


125

사용자 컨트롤러에 있고 쇼 요청에 대한 json 응답을 원한다고 가정하면 show.json이라는 views / users / dir에서 파일을 만들 수 있다면 좋을 것입니다. 작업이 완료되면 파일이 렌더링됩니다.

현재 다음 라인을 따라 무언가를 수행해야합니다.

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

그러나 show.json 파일을 만들어 자동으로 렌더링되는 것이 좋을 것입니다.

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

이것은 나에게 많은 슬픔을 저장하고 컨트롤러에서 내 json을 렌더링 할 때 얻는 끔찍한 더러운 느낌을 씻어 낼 것입니다.


지금이 게시물을 보면,이 방법으로 많은 도움이되지는 않지만 더 복잡한 경우가 있습니다. 이것이 두통을 유발한다고 말할 때 저를 믿으십시오.
Matthew

1
레일 3에서, 당신은 단지 호출 할 수 있습니다 format.json로모그래퍼 show.json.erb파일. 내 대답을 참조하십시오.
James Lim

답변:


64

respond_to블록 에서 다음과 같은 작업을 수행 할 수 있어야합니다 .

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

에서 템플릿을 렌더링합니다 app/views/users/_show.json.erb.


5
이것은 좋지만 erb가 json을 생성하는 고통스러운 방법이라는 것을 빨리 알게 될 것입니다. 대안에 대한 내 대답을 확인하십시오.
tybro0103

1
부분을 ​​사용하지 않고 할 수있는 방법이 있습니까?
Wylliam Judd

55

뷰 추가 시도 users/show.json.erb이것은 JSON 형식을 요청할 때 렌더링되어야하며 erb에 의해 렌더링되는 이점도 추가되므로 파일은 다음과 같습니다.

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

9
@user.first_name.to_json대신에 사용하고 싶을 수도 있습니다 escape_javascript. JS가 허용하는 것과 엄격하게 JSON 이 무엇인지에 약간의 차이가 있습니다 . (브라우저가 자체 JSON 파서를 구현함에 따라 이러한 차이점이 중요 해지고 있습니다.)
James A. Rosen

1
JS와 달리 JSON은 큰 따옴표로 묶인 문자열 만 허용하므로 작은 따옴표를 큰 따옴표로 변경해야합니다.
Abe Voelker

1
이것은 좋지만 erb가 json을 생성하는 고통스러운 방법이라는 것을 빨리 알게 될 것입니다. 대안에 대한 내 대답을 확인하십시오.
tybro0103

나는 이것이 오래된 대답이라는 것을 알고 있지만 완전히 잘못되었습니다. to_json은 형식화 된 json 문자열 ""을 이미 리턴하므로 결과 json은 추가 따옴표 ( ""value "")로 유효하지 않습니다. 또한 사용자 이름이 nil 인 경우 결과 json은 문자열 "null"을 값으로 갖습니다. 또한 <% =는 HTML 이스케이프를 사용하여 입력 데이터에서 HTML 문자를 엉망으로 만듭니다.
d4n3

나는 당신이 또한 따옴표를 제거해야한다고 생각 <%= xyz.to_json %>합니다. 그렇지 않으면 여분의 따옴표가 남습니다.
akostadinov

32

다른 사람들이 언급했듯이 users / show.json보기가 필요하지만 템플릿 언어에 대해 고려해야 할 옵션이 있습니다 ...

ERB

기본적으로 작동합니다. HTML에는 적합하지만 JSON에는 끔찍한 것이 있습니다.

RABL

좋은 해결책입니다. 의존성을 추가하고 DSL을 배워야합니다.

JSON 빌더

RABL과 같은 거래 : 좋은 해결책. 의존성을 추가하고 DSL을 배워야합니다.

평범한 루비

Ruby는 JSON을 생성 to_json하는 데 뛰어나고 Hash 또는 AR 객체를 호출 할 수 있으므로 배울 것이 없습니다 . 이니셜 라이저에서 템플릿의 .rb 확장자를 등록하기 만하면됩니다.

ActionView::Template.register_template_handler(:rb, :source.to_proc)

그런 다음 users / show.json.rb보기를 작성하십시오.

@user.to_json

이 방법에 대한 자세한 내용은 http://railscasts.com/episodes/379-template-handlers를 참조하십시오.


7
레일 4에서 .ruby 템플릿 핸들러는 기본적으로 github.com/rails/rails/commit/de1060f4e02925c12004f2 로 등록 되므로 .rb 등록을 건너 뛰고 파일 이름을 users / show.json.ruby로 지정할 수 있습니다.
Tim Diggins

1
또한,이 또한, json_builder가로 대체 된 업데이트 github.com/rails/jbuilder .
Tim Diggins

27

RABL은 아마도 ERb 구문에 대한 더 확실한 대안을 찾고 있다면 내가 본 가장 좋은 해결책 일 것입니다. 다른 솔루션 인 json_builder 및 argonaut는 다소 구식으로 보이며 일부 패치가 없으면 Rails 3.1에서 작동하지 않습니다.

RABL은 gem을 통해 사용 가능하거나 GitHub 리포지토리를 확인하십시오. 좋은 예도

https://github.com/nesquena/rabl


21

이 페이지에서 끝나는 다른 사람들을 위해이 답변을 업데이트하십시오.

Rails 3에서는에 파일을 만들면됩니다 views/users/show.json.erb. @user객체는 뷰에 사용할 수 있습니다 (이 HTML에 대한 것처럼.) 당신은 필요가 없습니다 to_json더 이상.

요약하면, 그것은 단지

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

1
나는이 1.5 년 전에 대답했다. 요즘 JSON과 같이 필요할 때마다 respond_with를 사용 respond_with @user, only: [:name]합니다. 자세한 정보는이 학습서 를 참조하십시오.
James Lim

1
이 답변에 추가하기 만하면 실제로 두 가지 이유로 위험합니다. 줄 바꿈 및 백 슬래시를 이스케이프하지 않기 때문에 사용자 데이터에서 주입 할 수 있으며 <% = html 데이터를 이스케이프하므로 Sean O'Connor가 이름을 갖습니다. Sean O'Connor에게 엉망이되었습니다.
d4n3

10

show.json.erb내용으로 파일을 추가 하십시오.

<%= @user.to_json %>

때로는 컨트롤러에서 사용할 수없는 추가 도우미 메서드, 즉 image_path(@user.avatar)JSON에서 추가 속성을 생성 하는 데 필요한 메서드가 필요할 때 유용합니다 .

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>

8
그것은 할 필요가 <%= raw(@user.to_json) %>HTML 탈출 방지하기 위해. 내가하는 것은 내가 원하는 것을 제공하는 한 to_json에 의존하지만, 다른 것을하고 싶을 때 일반적으로 { :blah => @user.the_blah }.to_json.
clacke


0

RoR을 처음 접했을 때 이것이 내가 알게 된 것입니다. 당신은 직접 JSON 형식을 렌더링 할 수 있습니다

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.