2014-11-12 4 views
0

나는 ember webapp의 백엔드 용 레일을 사용하여 API를 구축하고 있습니다. 우리는 '팔레트 (Palette)'라는 모델을 가지고 있는데,이 팔레트에는 여러 색상이 연관되어 있습니다. 엠버 애플 리케이션이 구축되는 방식 때문에 팔레트가 업데이트 될 때마다 색상을 삭제하고 새로운 오브젝트로 대체합니다. 문제는 색상의 새로운 상태가 더 이상 유효하지 않으면 이전 색상을 이미 삭제했으며 원래 상태로 되돌릴 수 없다는 것입니다. 지금까지 우리가 가진 유일한 해결책은 팔레트 컨트롤러의 update 메소드에서 새로운 색상 생성이 실패하거나 팔레트가 실패 할 경우 예외를 throw하는 트랜잭션을 만드는 것입니다. 이 솔루션이 작동하는 동안 약간 어색한 느낌입니다. 더 우아한 해결책이 있습니까? 당신은 액티브가 링크에 설명 된 단계의 전체 무리를 통과 객체를 저장할 때마다레일 - 부모 모델의 상태로 관련 모델의 상태를 확인하는 방법

validate :all_colors_valid 

def all_colors_valid 
    colors.each do |color| 
    errors.add('Color', 'invalid') unless color.valid? 
    end 
end 

:

class PalettesController < BaseController 

    def update 
    ActiveRecord::Base.transaction do 
     begin 
     palette = Palette.find params[:id] 
     palette.destroy_colors 
     params[:palette][:colors].each do |color| 
     Color.create! palette: palette, 
        name: color[:name], 
        cmyk: color[:cmyk], 
        color_type: color[:color_type] 
     end 
     return render json: palette.errors, 
      status: :unprocessable_entity unless palette.save! 
     rescue 
     return render json: { error: 'Unable to process the request' }.to_json, 
      status: :unprocessable_entity 
     end 
     render json: palette, status: 200 
    end 
    end 

end 

답변

0

나는 당신이 당신의 팔레트 모델에 다음 코드를 추가하여, 다음과 같이 그것을 해결할 수 있다고 생각 이하. 그 중 하나는 표준 유효성 검사가 될 수있는 유효성 검사 또는 사용자 정의 유효성 검사를 작성할 수 있습니다.

유효성 검사 단계 후 저장된 개체에 오류가있는 경우 저장 작업이 중단되고 데이터베이스가 변경되지 않습니다.

errors.add으로 전송 된 두 매개 변수는 오류가있는 열의 이름과 문제점을 나타냅니다. 어쩌면 색깔이 좋지 않거나 그런 것을 말하면 좋을 것입니다.

이 유효성 검사가 완료되면 새 색상이 만들어지지 않습니다. 그것들은 모두 오류없이 구원받을 수있을뿐입니다.

팔레트 모델로 자동 저장되도록하려면 after_save 작업을 수행하는 것이 좋습니다.

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

답장을 보내 주셔서 감사합니다. 나의 이해는 만약 검증 방법이 실패하면 팔레트 객체 만이 원래의 상태로 되돌아 간다는 것이다. 삭제 된 색상은 여전히 ​​삭제되며 이전 상태로 되 돌리므로 효과가 없습니다. – sojo2600

+1

임시 색상 표에서 오래된 색상을 저장하는 방법과'if pallet.save' 색상을 삭제하는 방법은 무엇입니까? 'else'가 그들을 다시 움직이겠습니까? – Albin

+0

아마 그렇게 할 수도 있습니다. 내가 게시 한 거래 솔루션에 어떤 이점이 있다고 제안합니까? – sojo2600