문제

내가하려는 것은 다음과 같습니다.

언제든지 사용자는 1 개의 활성 프로필을 가질 수 있습니다. 이 활성 프로필은 사이트의 규칙 및 규정을 준수하는지 확인하기 위해 관리자가 승인해야합니다. 사용자가 프로필을 편집하면 관리자가 변경 사항에 서명 할 때까지 공개 프로필이 영향을받지 않습니다. 프로필이 검토중인 동안 편집을하는 경우 편집은 검토를 위해 미결제 프로필에 적용되며 대기열 뒷면으로 푸시됩니다.

내 모델은 다음과 같이 보입니다.

class Profile < AR:B
    belongs_to :user
end

class User < AR:B
    has_many :profiles do
        def active
            ...
        end
        def latest
        end
    end
    def profile
        self.profiles.active
    end
end

하나의 작은 트위스트가 있습니다 ... 프로파일 컬렉션이 노출되지 않으므로 사용자는 프로필을 직접 편집 할 수 없습니다. 대신 그들은 사용자를 편집하고 프로필 필드가 표시됩니다.

이것을 관리하는 가장 좋은 방법은 무엇입니까? 현재 사용 중입니다.

accepts_nested_attributes_for :profiles

사용자에게는하지만 그것은 매우 해킹 된 것 같습니다. 이상적 으로이 논리의 대부분은 모델에 살 것이지만, 내가 유혹하는 또 다른 것은 발표자를 사용하는 것입니다.

어떤 생각도 대단히 감사하겠습니다. 의견으로 더 많은 정보가 필요하면 알려 주시면이 게시물을 적절하게 업데이트하겠습니다.

도움이 되었습니까?

해결책

어쩌면 사용자에서 프로필로 두 가지 관계를 가질 수 있습니다. 하나는 사용자 인터페이스를 통해 편집 할 수 있고 다른 하나는 관리자가 승인 한 것입니다.

다음과 같은 작업을 수행 할 수 있습니다.

class User < AB:B

has_one :profile #the user-editable one one
has_one :active_profile, :class_name=>"profile" #the one shown

end

그런 다음 양식을 통한 사용자 프로파일의 각 변경 사항은 관리자 (사용 및 관찰자 또는 그냥 및 "After_save"필터)에 대해 표시됩니다. 그것이 그것을 옹호하면, 변경 사항은 Active_profile One에 덤프되어 어딘가에 표시됩니다.

이렇게하면 깨끗한 양식 인터페이스를 가질 수 있으며 다시 편집 할 때마다 최신 (승인되지 않은) 프로필이 보입니다. 또한 updated_at 열을 사용하여 대기열을 주문하여 "편집은 미결제 프로파일에 적용되며 큐의 뒷면으로 푸시됩니다"기능을 얻을 수 있습니다.

다른 팁

사용자 모델이 위에서 제안한 것처럼 두 가지 프로파일과 관계를 맺게함으로써 이것에 대해 이야기합니다. 하나의 "승인 된"프로필과 관리 대기열에 들어가는 편집을위한 프로필.

그러나 "보류중인"프로파일과 "승인 된"프로파일 사이의 전환을 처리하기 위해 전환을 처리하기 위해 상태 머신을 추가하는 것이 좋습니다. AASM 보석은 최근 프로젝트에서 나에게 좋았습니다. (http://github.com/rubyist/aasm/tree/master), 그리고 나는 Edge Rails가 단지 상태 기계를 구운 것으로 생각합니다. (http://github.com/rails/rails/commit/aad5a30bf25d8a3167afd685fc91c99f4f09cc57)

모델은 다음과 같이 보일 수 있습니다.

class User < AR:B

has_one :active_profile 
has_one :pending_profile

include ActiveRecord:: StateMachine

state_machine do
   state :approved
   state :pending
   state :rejected

   event :update_profile_pending do
    transitions :to => :pending, :from => [:approved], :on_transition => :send_to_admin_queue
  end

   event :update_profile_approved do
    transitions :to => :approved, :from => [:pending], :on_transition => :update_current_profile
   end

   event :update_to_rejected do
    transitions :to => :rejected, :from => [:pending]
  end
end

def send_to_admin_queue
  //method to handlesending pending profiles to admin for approval
end

def update_current_profile
 //method to handle updated profiles with changes
end

end

그런 다음 user.update 프로필 보류에 전화 할 수 있습니다! 또는 user.update 프로필 승인! 프로필 상태를 전환하고 전환 콜백을 사용하여 활성 프로파일과 보류 프로파일간에 편집 데이터를 보내는 것을 처리합니다.

실제 양식과 함께 Nested_attributes_를 사용하는 한 해킹이라고 생각하지 않습니다. 중첩 된 속성을 업데이트하는 데 사용했으며 잘 작동했습니다. 이 경우 2 개의 프로파일이 있기 때문에 필요하지 않을 수도 있지만 (한 공개, 1 개 보류 중).

그냥 아이디어! 여기서 큰 소리로 생각합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top