diff --git a/caprese.gemspec b/caprese.gemspec index fdc2c42..63e99e2 100644 --- a/caprese.gemspec +++ b/caprese.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'active_model_serializers', '0.10.7' spec.add_dependency 'kaminari', '>= 0.17.0' - spec.add_dependency 'rails', '>= 5.1.0', '< 6.0.0' + spec.add_dependency 'rails', '>= 5.2.0', '< 6.0.0' spec.add_development_dependency 'bundler' spec.add_development_dependency 'factory_girl' diff --git a/lib/caprese.rb b/lib/caprese.rb index d0cc52c..24aab29 100644 --- a/lib/caprese.rb +++ b/lib/caprese.rb @@ -3,6 +3,7 @@ require 'caprese/routing/caprese_resources' require 'caprese/serializer' require 'caprese/version' +require 'caprese/app/models/current' module Caprese def self.config diff --git a/lib/caprese/app/models/current.rb b/lib/caprese/app/models/current.rb new file mode 100644 index 0000000..98258ed --- /dev/null +++ b/lib/caprese/app/models/current.rb @@ -0,0 +1,5 @@ +module Caprese + class Current < ActiveSupport::CurrentAttributes + attribute :caprese_style_errors + end +end diff --git a/lib/caprese/controller/concerns/errors.rb b/lib/caprese/controller/concerns/errors.rb index 9298f8c..45c0cd5 100644 --- a/lib/caprese/controller/concerns/errors.rb +++ b/lib/caprese/controller/concerns/errors.rb @@ -7,7 +7,7 @@ module Errors extend ActiveSupport::Concern included do - around_action :enable_caprese_style_errors + before_action :enable_caprese_style_errors rescue_from(StandardError) { |e| handle_exception(e) } end @@ -31,15 +31,12 @@ def error(field: nil, code: :invalid, t: {}) # Temporarily render model errors as Caprese::Record::Errors instead of ActiveModel::Errors def enable_caprese_style_errors - Caprese::Record.caprese_style_errors = true - yield - Caprese::Record.caprese_style_errors = false + Current.caprese_style_errors = true end # Gracefully handles exceptions raised during Caprese controller actions. # Override this method in your controller to add your own exception handlers def handle_exception(e) - Caprese::Record.caprese_style_errors = false if e.is_a?(Caprese::Error) output = { json: e } render output.merge(e.header) diff --git a/lib/caprese/record.rb b/lib/caprese/record.rb index 6a0c6a4..d2a6e76 100644 --- a/lib/caprese/record.rb +++ b/lib/caprese/record.rb @@ -11,12 +11,9 @@ module Record extend ActiveSupport::Concern include Aliasing - mattr_accessor :caprese_style_errors - @@caprese_style_errors = false - # @return [Errors] a cached instance of the model errors class def errors - @errors ||= (Caprese::Record.caprese_style_errors ? Caprese::Record : ActiveModel)::Errors.new(self) + @errors ||= (Current.caprese_style_errors ? Caprese::Record : ActiveModel)::Errors.new(self) end end end diff --git a/lib/caprese/record/associated_validator.rb b/lib/caprese/record/associated_validator.rb index 0747957..3375419 100644 --- a/lib/caprese/record/associated_validator.rb +++ b/lib/caprese/record/associated_validator.rb @@ -15,7 +15,7 @@ module Record # ] class AssociatedValidator < ActiveRecord::Validations::AssociatedValidator def validate_each(record, attribute, value) - if Caprese::Record.caprese_style_errors + if Current.caprese_style_errors Array(value).reject { |r| r.marked_for_destruction? || r.valid? }.each do |invalid_record| invalid_record.errors.to_a.each do |error| field_name = error.field ? "#{attribute}.#{error.field}" : attribute diff --git a/spec/record_spec.rb b/spec/record_spec.rb index 0075b43..c589495 100644 --- a/spec/record_spec.rb +++ b/spec/record_spec.rb @@ -3,8 +3,8 @@ describe Caprese::Record, type: :model do let(:record) { create :post } - before { Caprese::Record.caprese_style_errors = true } - after { Caprese::Record.caprese_style_errors = false } + before { Caprese::Current.caprese_style_errors = true } + after { Caprese::Current.caprese_style_errors = false } describe '#errors' do let(:options) { {} }