0

나는 Rails 5.0을 사용 중입니다. 이것이 제대로 작동해야하는지, 아니면 다른 접근 방식을 취해야하는지 잘 모르겠습니다. 나는 procedure has_many Complications가 그렇게 정의 된 procedure와 complication을위한 모델을 가지고 있습니다;accepts_nested_attributes_for에 대한 reject_if 옵션을 사용하여 업데이트하는 동안 하위를 삭제하는 방법

class Procedure < ActiveRecord::Base 
    has_many :complications, dependent: :destroy 
    accepts_nested_attributes_for :complications, allow_destroy: true, reject_if: proc{|attr| attr[:name] == 'None'} 
end 

class Complication < ActiveRecord::Base 
    belongs_to :procedure 
    validates :name, presence: true 
end 

사용자에게 여러 합병증이있는 중첩 된 양식이 제공됩니다. 나는 이것을 동적으로하기 위해 고치 보석을 사용했다. 새 레코드에서 사용자에게 빈 합병증 선택 상자가 표시됩니다. 그들이 비워두면 유효성 검사가 실패합니다. 이것은 그들이 필드를 건너 뛰는 것을 막기 위해 'None'을 선택하게하는 것입니다. 'None'을 선택하면 reject_if 옵션으로 인해 아무런 문제도 발생하지 않습니다. 이 모든 것은 예상대로 정확하게 작동합니다.

문제는 합병증을 선택하면 (예 : '실패') 프로 시저 레코드가 편집되는 경우 발생합니다. 합병증이 '없음'으로 변경되고 기록이 업데이트되면 합병증은 변경되지 않고 그대로 유지됩니다 (즉, '실패'). 필요한 행동으로 인해 합병증이 파괴됩니다.

아마도 reject_if 옵션은 이미 존재하는 업데이트의 레코드를 삭제하는 기능을 수행하지 않습니다. 이 올바른지? 그렇다면 내 사건을 다루기위한 적절한 방법은 무엇인가?

TIA.

답변

0

원하는 것은 reject_if 옵션의 범위를 벗어납니다.

이름이 "없음"(또는 공백 또는 nil) 인 경우 허용 목록에있는 매개 변수를 변경하여 _destroy = '1'을 추가하는 기능을 얻을 수 있어야합니다.

class ProceeduresController 

    # ... 

    def update 

    end 

    private 
    # ... 
    # Only allow a trusted parameter "white list" through. 
    def proceedure_params 
     params.require(:proceedure) 
      .permit(:name,complications_attributes: [:id, :name, :_destroy]) 
    end 

    def update_params 
     proceedure_params.tap do |p| 
     p["complications_attributes"].each do |a| 
      if a[:id].present? && ["None", nil, ""].includes?(a[:name]) 
      a[:_destroy] = '1' 
      end 
     end 
     end 
    end 
end 

class Procedure < ActiveRecord::Base 
    has_many :complications, dependent: :destroy 
    accepts_nested_attributes_for :complications, 
    allow_destroy: true, 
    reject_if: :reject_attributes_for_complication? 

    def self.reject_attributes_for_complication? 
    return false if attr[:_destroy] 
    attr[:name] == 'None' 
    end 
end