2014-01-21 2 views
2

를 거부 :승인 레일에 PaperTrail 사용/여기 내 코드는 지금까지입니다 편집

class Video < ActiveRecord::Base 
    has_paper_trail meta: { athlete_id: :athlete_id, approved: false }, 
        if: Proc.new { |v| v.needs_approval? } 
    validate :should_be_saved? 

    def should_be_saved? 
    errors.add(:base, 'added for approval') if needs_approval? 
    end 

    def needs_approval 
    @needs_approval ||= false 
    end 

    def needs_approval? 
    @needs_approval 
    end 

end 

# ApplicationController 
class ApplicationController < ActionController::Base 

    def user_for_paper_trail 
    return unless user_signed_in? 
    original_user.present? ? original_user : current_user 
    end 

    # Used to determine the contributor 
    # When contributor logs in, warden saves the contributor_id in session 
    def original_user 
    return nil unless remember_contributor_id? 
    @original_user ||= User.find(remember_contributor_id) 
    end 

    def info_for_paper_trail 
    { athlete_id: current_user.id } if current_user 
    end 

end 

나는 현재에 실행하고 문제는 (내가 너무 그것을 이야기하기 때문에) 비디오 객체가 검증이 실패 저장 될 때입니다 ,하지만 유효성 검사가 실패 할 필요가 있지만 버전 객체는 계속 생성됩니다. 그 일을하는 방법에 대해 너무 확신하지 못합니다.

여기
내 코드 (아래 코드는 여전히 위에서 ApplicationController 코드를 사용)입니다 편집 :

class Video < ActiveRecord::Base 
    # .. other methods 

    include Contributable 
    attr_accessible :video_type_id, :athlete_id, :uploader_id, :created_at, :updated_at, :uniform_number, :featured, 
        :name, :panda_id, :date, :thumbnail_url, :mp4_video_url, :from_mobile_device, :duration, :sport_id, 
        :delted_at, :approved 
end 

module Contributable 
    extend ActiveSupport::Concern 

    included do 
    has_paper_trail meta: { athlete_id: :athlete_id, approved: false }, 
        unless: Proc.new { |obj| obj.approved? }, 
        skip: [:approved] 
    end 

    def log_changes_or_update(params, contributor = nil) 
    update_attribute(:approved, false) unless contributor.blank? 

    if contributor.blank? 
     update_attributes params 
    else 
     self.attributes = params 
     self.send(:record_update) 
     self.versions.map(&:save) 
    end 
    end 

end 

class VideosController < ApplicationController 
    def update 
    # ... other code 
    # original_user is the contributor currently logged in 
    @video.log_changes_or_update(params[:video], original_user) 
    end 
end 

내가 일하고 애플 리케이션 사용자를 허용 복잡성의 작은 층을 가지고 그들도 액세스 할 수있는 프로필을 편집하는 특정 역할. 기존 개체에 영향을주지 않고 각 변경의 버전을 저장하려고합니다 (paper_trail 사용).

위의 코드는 정확히 내가 원하는 방식으로 작동하지만, 내 log_changes_or_update 메서드가 전체 목표를 달성하는 올바른 방법이 아닌지 궁금합니다.

답변

2

유효성 검사를 제거하고 기본값 falseapproved 특성을 Video 모델에 추가하면 어떨까요? 그런 식으로 Video 개체가 저장되고 paper_trail version이 생성됩니다. 나중에 비디오가 승인되면 paper_trail은 변경 사항을 기록합니다.

+0

도움 주셔서 감사합니다. 이것은 정확히 내가 끝내었던 것이다! 감사! – dennismonsewicz

+0

다행 이군! – jcm

+0

내가 작업하고 있던 새로운 코드를 포함하도록 내 질문을 업데이트했습니다. 생각? – dennismonsewicz