2016-07-11 2 views
0

하나의 JSON 요청 만 사용하여 여러 데이터베이스 항목을 만들려고합니다. 각 항목은 유형 (작업)과 시간 (작업이 발생한 시점)의 두 값으로 구성됩니다. 여러 요청을 하나의 요청으로 가져 오려면 JSON Array를 사용하고 있습니다. 나는이 같은 컨트롤러 (/actions.json)에 POST 요청을 보낼 때레일스에서 ​​JSON Array POST 요청을 처리하는 방법은 무엇입니까?

def create 

    respond_to do |format| 

    @actions = [] 
    save_succeeded = true 
    params[:action].each do |action| 
     new_action = Action.new(type: action.type, time: action.time) 
     save_succeeded = false unless new_action.save 
     @actions << new_action 
    end 

    if save_succeeded 
     format.json { render json: @actions, status: :created } 
    else 
     format.json { render json: @actions.errors, status: 501 } 
    end 
    end 
end 

:

[{ "type": 0, "time": 1234567890 },{ "type": 0, "time": 1234567891 }] 

내가 다시 빈 얻을

이 같은 컨트롤러가 보입니다의 조치를 생성의 나 무엇인가 배열 [] 및 상태 코드 201 Created.

즉, save_succeeded 변수는 여전히 유효하지만 동작이 배열에 추가되지 않았습니다. 또한 작업이 내 데이터베이스에 없습니다.

내가 뭘 잘못하고 있니? 나는 무엇을 간과하고 있는가?

답변

0

나는 코드를 조금 리팩터링 것 : 주목할만한 변화의

def create 
    actions = params[:action].inject([]) do |memo, action| 
    memo << Action.create!(type: action[:type], time: action[:time]) 
    end 

    render json: @actions, status: :created 

    rescue ActiveRecord::RecordInvalid => e  
    render json: e.message, status: 501 
    end 
end 

커플 :

  • 사용 create!rescue ActiveRecord::RecordInvalid - 저장이 실패 할 경우 create!ActiveRecord::RecordInvalid을 올릴 것이다. 그런 다음 구조 블록이 예외를 구하고 멋진 오류 메시지를 렌더링 할 수 있습니다.

  • params은 해시가 아니기 때문에 action.time을 사용할 수 없습니다.

  • 나중에 렌더링 할 배열을 만들려면 inject을 사용할 수 있습니다.

  • 이 항목에 대한 원 자성을 원한다면 (모든 것이 생성되었거나 아무것도 표시되지 않습니다!) 트랜잭션 블록에 전체를 래핑 할 수 있습니다.

위의 코드를 테스트하지는 않았지만 방향을 알려야하고 (아마도) 드롭 인 대체품이되어야합니다.

희망 하시겠습니까?

+0

답변 해 주셔서 감사합니다. 그것은 새로운 방향 (해시 값으로 매개 변수)을 시도해보고 비슷한 솔루션을 구현했습니다. 그러나 이전과 거의 비슷한 문제가 남아 있습니다. 오류 메시지가 표시되지 않지만 빈 배열과 동작이없는 상태 코드 201 (Created)이 발생합니다. 이것이 구현하기에는 어려움이 있으므로, 단일 요청 만 받아들이고 많은 요청을해야하는 구현 방법이 가장 적합 할 것입니다. 그래도 도와 ​​줘서 고마워! – NerdyTherapist

관련 문제