1

레일즈 단일 테이블 상속 패턴을 통해 기본 클래스 "엔터티"에서 파생 된 두 개의 클래스 "Person"과 "Group"이 있습니다. 이 패턴은 많은 코드를 다 써 버렸습니다.Rails 단일 테이블 상속, params 및 PUT을 기본 클래스

엔티티 자체는 관계가 없지만 (예 : has_many) 개인과 그룹은 관련성이 있습니다.

내 코드를 단순화하는 과정을 계속하면 개인 또는 그룹 개체에 대한 변경 사항은/entities/: id에 대한 PUT이며 업데이트 작업을 트리거합니다.

문제를 입력하십시오. 레일즈는 attr_accessible을 사용하고 클래스가 params [: entity] 객체를 빌드하는 관계를 사용합니다. 내가 PUT 할 수있는 것들 (예 : Group과 관련된 operator_attributes)은 Group에만 나타나지만 Entity에는 나타나지 않기 때문에 Rails는 params [: entity]에 이들을 포함하지 않습니다.

엔티티 컨트롤러를 사용하면서 params [: entity]를 빌드하기 위해 레일스 로직을 다시 작성할 필요없이이 문제를 해결하려면 어떻게해야합니까?

답변

0

나는이 동일한 문제에 반대했다. 서브 클래 싱 된 모델은 충분히 다르게 작동하여 얇은 컨트롤러를 만들어 내 얇은 모델과 함께 사용하게되었습니다. 그들은 각각 다른 검증 요구 사항을 가졌습니다. 나는 일반 Entity 객체를 만들고 PUT 중에 type 속성을 설정할 수 없습니다. 나는 올바른 종류의 대상을 만들어야했습니다.

분명히 그것은 당신이 원하는만큼 건조한 상태가 아니며, 나에게도 해당되지 않았습니다. 하지만 필자의 경우 Entity 컨트롤러/모델을 관리자 패널에서 사용하므로 항목을 표시하고 기본보고를 수행 할 수 있습니다. 사용자 측면에서는 분리되어 있으며 엔터티가 보호됩니다. 그것들은 다른 논리와 견해로 다른 상황에서 사용됩니다. 따라서 나에게는 서브 클래 싱 된 각 모델에 대해 별도의 컨트롤러와 뷰를 사용하는 것이 옳은 결정이었습니다.

STI에서 가장 중요한 점은 데이터베이스와 모델을 건조시키는 것입니다. 상속 된 모델이 동일한 방식으로 동작하고 표시되는 경우 그 이상으로 DRY하는 것이 더 쉬워집니다. 희망이 어떤 식 으로든 도움이됩니다.

0

EntityController에 대해 wrap_parameters를 사용하지 않도록 설정하고 클라이언트 쪽에서 원래 PUT 요청에 루트 엔터티 키를 만들어이 문제를 해결했습니다.

"attribute_names"메서드가 모델에 존재하면 모델을 호출 할 것이므로 기본 Entity 모델에서 .constantize() 또는 다른 메서드를 사용하여 올바르게 수행 할 수 있다고 가정합니다.

wrap_parameters가 params 해시를 프로그래밍 방식으로 다시 초기화하는 것이 가장 좋은 해결책입니다. 이것이 거의 가능해 보입니다. wrap_parameters를 변경할 수는 있지만 매개 변수를 다시 처리하는 방법을 찾지 못했습니다.

참조 : http://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html#method-i-process_action