16
respostas

validando campos

Ao cadastrar o sistema chama este metodo:

controller

    # POST /apartamentos
      # POST /apartamentos.json
      def create
        @apartamento = Apartamento.new(apartamento_params)
        @apartamento.ativo = true
        @apartamento.data_inclusao = DateTime.now

        respond_to do |format|
          if @apartamento.save
            format.html { redirect_to @apartamento, notice: 'Apartamento foi criado com sucesso!' }
            format.json { render :show, status: :created, location: @apartamento }
          else
            format.html { render :new }
            format.json { render json: @apartamento.errors, status: :unprocessable_entity }
          end
        end
      end

model

    class Apartamento < ApplicationRecord
      belongs_to :condominio
      has_many :veiculo
      has_many :funcionario
      has_many :morador
      has_many :receita_a_receber
    end

Como validar os campos desta classe ?

16 respostas

Oi Guilherme, tudo bem? O ActiveRecord que está acima dos modelos no Rails possui algumas facilidades. A documentação é cheia de exemplos:

Link: http://guides.rubyonrails.org/active_record_validations.html

Por exemplo, se quiser validar a presença do veiculo, você pode fazer:

validates :veiculo, presence: true

Então consegui fazer com que o campo se torne obrigatório assim, o que na verdade é o que preciso.

class Apartamento < ActiveRecord::Base
  belongs_to :condominio
  has_many :veiculo
  has_many :funcionario
  has_many :morador
  has_many :receita_a_receber

  # Cria validação
  validates  :unidade , :presence => true#{:message => "Unidade é obrigatório !"}   
end

Só que não consegui fazer a mensagem Unidade é obrigatório !, aparecer na view.

Aparece assim:

Fiz por este exemplo:

https://desenvolvimentoaberto.org/category/ruby-on-rails/

Só que não consegui implementar a parte da view

Assim:

validates  :unidade , :presence => { :message => "Unidade é obrigatório !"}

E na última parte da página na documentação mostra o jeito certinho de mostrar as mensagens: http://guides.rubyonrails.org/active_record_validations.html#displaying-validation-errors-in-views

Pode me mostrar como tá fazendo nas views?

Obrigado, mas só aparece: Unidade não pode ficar em branco

Na view está assim:

  <% if @apartamento.errors.any? %>
    <div id="error_explanation">
      <ul>

      <% @apartamento.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>

      </ul>
    </div>
  <% end %>

Puxa, que estranho, deveria funcionar desse jeito. Preciso testar rapidinho pra ver o que pode ser. Que versão do Rails você está usando Guilherme?

Você esta dizendo que era para aparecer Unidade é obrigatório ! ?

ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

Oi, Guilherme, tudo bem?

Você tá usando algum versionador de código? Tipo um Github ou similar, vendo o código talvez ajude a solucionar sua dúvida.

Isso Guilherme, era pra aparecer "Unidade é obrigatório !". Mas segue a orientação do Henrique acima, disponibiliza o código completo pra gente ver no github se puder.

Desculpe a demora

https://github.com/guilhermecostalopes/projetoRuby

Oi, Guilherme, tudo bem?

Coloquei exatamente a linha que o Wanderson havia enviado no model Apartamento e apareceu exatamente a mensagem que você queria.

  validates  :unidade , :presence => { :message => "Unidade é obrigatório !"}

Posso dar mais algumas dicas de código?

  • Depois faz o seeds.rb porque assim fica fácil de alguém testar sua aplicação já com alguma coisa funcionando.
  • O que acha de dar uma refatorada no código porque tem users e usuários
  • Seria bom limpar o arquivo de rotas também porque você tem, por exemplo:
get 'users/new'
resources :users

o resources já está gerando um new

  • Uma outra coisa no seu Gemfile é que repete sqlite duas vezes, uma no grupo :development e outra no :development, :test você pode deixar só no :development, :test
  • Uma dica é que todo model seu tem um campo data_inclusao e o do Rails também created_at você pode sobreescrever os métodos do Rails pra trocar o nome ou talvez usar os do Rails

São só algumas dicas legais pra você melhorar seu código ainda mais porque ele já tá muito bom.

Bons estudos!

Você está falando que deve ficar assim:

class Apartamento < ActiveRecord::Base
  belongs_to :condominio
  has_many :veiculo
  has_many :funcionario
  has_many :morador
  has_many :receita_a_receber

  # Cria validação
  validates  :unidade , :presence => { :message => "Unidade é obrigatório !"}
end

Ao invés de ficar assim:

class Apartamento < ActiveRecord::Base
  belongs_to :condominio
  has_many :veiculo
  has_many :funcionario
  has_many :morador
  has_many :receita_a_receber

  # Cria validação
  validates  :unidade , :presence => true
end

É isto ?

Isso! Em qual view você quer usar essa mensagem?

/apartamentos/new?

Mas deu certo ou não deu certo?

https://imgur.com/a/qchq4ls

Upa, estou atrasando nessa discussão, de qualquer forma, vou deixar com você Henrique! Guilherme, continua dando feedback aqui pra gente saber se resolveu mesmo, ok?