나는 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
답장을 보내 주셔서 감사합니다. 나의 이해는 만약 검증 방법이 실패하면 팔레트 객체 만이 원래의 상태로 되돌아 간다는 것이다. 삭제 된 색상은 여전히 삭제되며 이전 상태로 되 돌리므로 효과가 없습니다. – sojo2600
임시 색상 표에서 오래된 색상을 저장하는 방법과'if pallet.save' 색상을 삭제하는 방법은 무엇입니까? 'else'가 그들을 다시 움직이겠습니까? – Albin
아마 그렇게 할 수도 있습니다. 내가 게시 한 거래 솔루션에 어떤 이점이 있다고 제안합니까? – sojo2600