Nesta aula iremos aprender a utilizar os comandos const_missing e method_missing, com isso iremos criar classes com atributos de um csv dinâmicamente.

Metaprogramming - Missings


Hoje falaremos sobre:

Acesso o irb para testar alguns códigos

        
          > 1.class
          => Integer
        
      

Arquivo aula.rb final:

      
        # missings
        require 'byebug'

        class Danilo
          def self.method_missing(nome, parametro)
            nome = nome.to_s

            if nome =~ /busca_por_/
              puts "Bucando no arquivo por #{nome.gsub("busca_por_", "")}, com o valor #{parametro}"
              return
            end

            puts "Metodo de classe #{nome}, não exite na classe #{self}"
          end

          def method_missing(nome)
            nome = nome.to_s
            File.open("database/Danilo.csv") do |arquivo|
              arquivo.each do |linha|
                campos = linha.split(";")

                unless campos.include?(nome)
                  puts "Campo #{nome}, não existe no csv database/Danilo.csv"
                end

              end
            end

            return nil
          end
        end

        # puts Danilo.teste
        puts Danilo.busca_por_dsdsdse("jsssoao")


        # class Danilo
        #   def self.const_missing(nome)
        #     puts "Não existe a constante #{nome} na classe #{self}"
        #   end
        # end

        # Danilo::TESTE


        # class Danilo
        #   def method_missing(nome)
        #     puts "Não existe a propriedade #{nome} na classe #{self.class}"
        #   end

        #   def self.method_missing(nome)
        #     puts "Não existe a propriedade de classe #{nome} na classe #{self}"
        #   end
        # end

        # Danilo.new.nome
        # Danilo.teste
      
    

Arquivo classes_dinamicas_csv.rb final:

      
        # missings
        require 'byebug'

        # class Module
        #   old_const_missing = instance_method(:const_missing)

        #   define_method(:const_missing) do |nome|
        #     existe = File.exist?("database/#{nome}.csv")
        #     if !existe
        #       puts "Classe #{nome} não encontrada"
        #       return
        #     end

        #     old_const_missing.bind(self).call(nome)
        #   end
        # end

        class Module
          def const_missing(nome)
            existe = File.exist?("database/#{nome}.csv")
            unless existe
              puts "Classe #{nome} não encontrada, porque não existe nenhum csv no diretório database"
              return
            end
            const_set(nome, Class.new)
            klass = const_get(nome)

            File.open("database/#{nome}.csv") do |arquivo|
              arquivo.each do |linha|
                campos = linha.split(";")

                campos.each do |campo|
                  klass.class_eval do

                    define_method("#{campo}=") do |value|
                      instance_variable_set "@#{campo}", value
                    end

                    define_method("#{campo}") do
                      instance_variable_get "@#{campo}"
                    end

                  end
                end

                break

              end
            end

            klass
          end
        end

        d = Pessoa.new
        d.nome = "danilo teste"
        puts d.nome

        puts d.methods - Class.methods
      
    

Arquivo const_missing_de_uma_classe.rb final:

      
        # missings
        require 'byebug'

        class Danilo
          TESTE = "123456"
          def self.const_missing(nome)
            puts "Constante #{nome}, não exite na classe #{self}"
          end
        end

        puts Danilo::TESTE
      
    




Próximas Aulas


Instalando Rails

Nesta aula iremos aprender a instalar e configurar o Rails que é um do...

Rails Generators

Nesta aula iremos aprender um pouco sobre os generators do Rails, util...

Rails - Routes

Nessa aula iremos iniciar uma aplicação web do zero, agora passo a pas...

Rails - Partials

Nesta aula iremos aprender como dividir o conteúdo de nossos templates...

Rails - Migrations

Nesta aula iremos aprender a diferença de fazer um modelo de forma man...

Rails - Forms

Nesta aula iremos aprender como fazer um CRUD de forma manual no Rails...

Rails - initializers

Nesta aula iremos aprender como configurar dados na inicialização de u...

Rails - Helpers

Nesta aula iremos aprender como utilizar back-end com front-end e orga...



Danilo

Arquiteto de software, analista, programador, professor. Danilo criou o projeto torne-se um programador, para passar o seu conhecimento para a nova geração. Com o intuito de ser um bom pai, Danilo trabalha muito motivado para garantir o futuro de sua filha.

ELEVE SEUS GANHOS E POTENCIALIZE SUA PERFORMANCE

Receba nossa Ebook de LÓGICA DE PROGRAMAÇÃO

© Didox Business & Technology - CNPJ: 12.127.195/0001-14