tapajos / brazilian-rails

Brazilian Rails é um conjunto de gems para serem usadas com Ruby e com o Ruby on Rails e tem como objetivo unir alguns recursos úteis para os desenvolvedores brasileiros.
http://brazilian-rails.rubyforge.org
361 stars 100 forks source link

user_como_dinheiro sem ActiveRecord #73

Open brunofrank opened 9 years ago

brunofrank commented 9 years ago

Estou tentando usar o BRDinheiro em uma classe que não extende de ActiveRecord, porém recebo um erro ruby undefined methodcomposed_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 commented 9 years ago

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