2010-01-22 3 views
6

지금까지 나는 항상처럼 responds_to 블록을 사용 행동에 대한 응답의 형식을 지정한 :항상 responds_to를 사용 하시겠습니까?

responds_to do |format| 
    format.js { render :json => @record } 
end 

최근 내가 깨달았 만 (위의 예에서와 같이) 한 형식을 지원하는 경우, 당신 돈 그 블록이 정말로 필요합니다. 그것을 그대로 두거나 제거하는 것이 가장 좋은 방법일까요?

답변

2

내가 answers- 기존과 다를거야 :

render :json => @record 

훨씬 더 간결보다 - 내 모든 행동에 대해 responds_to 블록을 보유하고 있습니다. 나는 약간 더 장황한 반면에, 그것은 행동을 더 분명히 스스로 문서화 한 것을 발견했다. 또한 앞으로 추가 형식을 쉽게 지원할 수 있습니다. 편집 : 또 다른 장점은 게이트 키퍼 역할을한다는 것입니다. 블록에 선언되지 않은 형식은 자동으로 "406 허용되지 않음"으로 제공됩니다.

+0

게이트 키퍼 아이디어, 좋은 생각을 생각하지 못했습니다. –

+0

그 경우, 그 위의 예에서 (예 : .js가없는 html의 경우) 정확한 헤더가없는 json이라는 레코드가 406 일 것입니다. 그렇다면 거대한 것입니다 ... – tfwright

+0

예, 위의'responds_to' 블록으로 .xml, .html 등의 요청은'406 Not Acceptable'을 반환해야합니다. – Ben

0

이것이 가장 좋은 방법인지 아닌지는 잘 모르겠지만 일반적으로 내가하고 싶은 것은 respond_to (즉, .:format을 끝에 붙임으로써) 경로를 열어두고 컨트롤러에서 사용하는 것입니다. 필요할 때.

예 :

routes.rb

map.connect :controller/:action/:id.:format 

model_controller.rb

# Return a collection of model objects 
def action_with_multiple_responses 
    @models = Model.all 

    respond_to do |format| 
    format.html #=> action_with_multiple_responses.html 
    format.xml { render :xml => @models } 
    end 
end 

# Return the first model object 
def action_with_one_response 
    @model = Model.first 
end 

그런 식으로, 당신은 불필요한 블록으로 action_with_one_response 방법을 어지럽히고되지 않습니다 , 그러나 당신이 원한다면 당신은 또한 아주 멋지게 스스로를 설정했습니다. 언젠가 xml, json 등에서 객체를 반환하십시오.

+0

저는 믿습니다. 기본적으로 형식이 추가되었습니다. – vise

+1

'map.resources'를 사용하는 것이지만,'map.connect' 만 사용한다면 믿을 수 없습니다. - 적어도 제 경험이었습니다. (내가 틀린 뭔가를하지 않는 한). – jerhinesmith

+0

예, map.resources는 지정된 컨트롤러에 연결된 RESTful 라우트의 뗏목을 설정합니다. Connect는 지정된 형식으로 특정 경로를 설정합니다. –

0

응답 유형이 여러 가지가 아니라면 respond_to를 사용하지 말 것입니다.

단순히 추가 이해하는 코드 앱이 처리 할 및 핸들 :

responds_to do |format| 
    format.js { render :json => @record } 
end 
관련 문제