Вот мой код до сих пор:Использование 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
), не затрагивая существующий объект.
Код выше работает точно так, как я этого хочу, однако, мне просто интересно узнать, не является ли метод мой неправильным способом достижения общей цели.
Спасибо за помощь! Это именно то, что я сделал! Благодаря! – dennismonsewicz
Рад, что у вас это работает! – jcm
Я обновил свой вопрос, чтобы включить в него новый код, с которым я работал. Мысли? – dennismonsewicz