brazilian-rails icon indicating copy to clipboard operation
brazilian-rails copied to clipboard

user_como_dinheiro sem ActiveRecord

Open brunofrank opened this issue 10 years ago • 1 comments

Estou tentando usar o BRDinheiro em uma classe que não extende de ActiveRecord, porém recebo um erro ruby undefined method composed_of' for AccountTransfer:Class`, alguém tem alguma ideia se é possível?

class AccountTransfer
  include ActiveModel::Model
  include DinheiroActiveRecord

  attr_accessor :company_to_id, :account_to_id, :value

  validates :company_to_id, presence: true
  validates :account_to_id, presence: true  
  validates :value, numericality: { greater_than: 0 }

  usar_como_dinheiro :value
end

brunofrank avatar Dec 08 '14 01:12 brunofrank

Fiz um gato aqui que resolveu meu problema, se alguém se interessar!


module DinheiroActiveModel#:nodoc:

  def self.included(base)#:nodoc:
    base.extend ClassMethods
  end

  module ClassMethods#:nodoc:
    def usar_como_dinheiro(*args)#:nodoc:
      unless args.size.zero?
        args.each do |name|

          name = name.to_s
          module_eval <<-ADICIONANDO_METODO
          validate :#{name}_valido?

          def #{name}_valido?
            begin
              @#{name}.to_s.reais
            rescue Exception => e
              self.errors.add('#{name}', e.message)
            end
          end

          def #{name}=(value)
            if value.nil?
              @#{name} = nil
            elsif value.kind_of?(Dinheiro)
              @#{name} = value.valor_decimal
            else
              begin
                @#{name} = value.reais.valor_decimal
              rescue
                @#{name} = value
              end
            end
          end

          def #{name}
            @#{name}.reais if @#{name}
          end
          ADICIONANDO_METODO
        end
      end
    end
  end
end

brunofrank avatar Dec 08 '14 01:12 brunofrank