2014-01-21 2 views
2

Вот мой код до сих пор:Использование PaperTrail в Rails, чтобы одобрить/отклонить изменения

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), не затрагивая существующий объект.

Код выше работает точно так, как я этого хочу, однако, мне просто интересно узнать, не является ли метод мой неправильным способом достижения общей цели.

ответ

2

Почему бы не просто удалить проверку и добавить атрибут approved со значением по умолчанию false в модель Video? Таким образом, объект Video сохраняется и создается бумага_trail version. Позже, когда видео получит одобрение paper_trail, это также изменит.

+0

Спасибо за помощь! Это именно то, что я сделал! Благодаря! – dennismonsewicz

+0

Рад, что у вас это работает! – jcm

+0

Я обновил свой вопрос, чтобы включить в него новый код, с которым я работал. Мысли? – dennismonsewicz

Смежные вопросы