No meu programa Rails atual, quando uso algo como
user = User.find(10)
Quando não houver nenhum usuário com ID = 10, terei exceção como:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Posso obter nil em vez de gerar exceção, então quando faço algo como:
unless user = Challenge.find(10)
puts "some error msg"
end
Só quero obter nil quando não houver registros e não quiser usar begin / rescue
obrigado
Respostas:
Sim, basta fazer:
Para Rails 4 e 5:
fonte
.find_by_*
retorno seria nulo e o.find
não retornaria .Something.find_by(id: x)
ele criar uma instrução SQL com todos os pares atributo / valor do hash como parte da cláusula WHERE. Parece um bug do Rails para mim.find_by_...
para cada atributo que um modelo inclui:id
. Portanto,Challenge.find_by_id(10)
deve funcionar independentemente da versão do Rails.Challenge.find(10) rescue nil
No Rails 4, os localizadores dinâmicos - como os
find_by_id
usados na resposta aceita - foram descontinuados.Seguindo em frente, você deve usar a nova sintaxe:
fonte
Challenge.find_by(id: 10)
é a outra maneira de escrever issovocê pode fazer isso um pouco hackeado, basta usar a interface de consulta ActiveRecord.
isso retornará nulo, em vez de gerar uma exceção
fonte
find_by_id
é que ele é portátil do Rails 3 ao 4. No Rails 4, éfind_by(:id => 10)
.Por que você simplesmente não captura a exceção? Seu caso se parece exatamente com as exceções feitas para:
Se você quiser se recuperar do erro no bloco de resgate (por exemplo, definindo um usuário de espaço reservado (padrão nulo)), você pode continuar com seu código abaixo deste bloco. Caso contrário, você pode simplesmente colocar todo o seu código para o "caso feliz" no bloco entre "começar" e "resgatar".
fonte
begin…end
bloco, se você já tem um bloco, como um método de controlador. Nesse caso, a única linha extra de que você precisa é arescue
linha. Muito mais elegante e fácil de manusear do que verificarnil
com umaif
declaração.Você pode tentar isso
Challenge.exists?(10)
fonte
Para aqueles que lutam com mongóide , verifica-se que ambos
find
efind_by
métodos exceções - não importa a versão do Rails!Há uma opção (ou seja, raise_not_found_error ) que pode ser definida como falsa, mas quando falsey torna
find
método, não levanta a exceção também.Assim, a solução para usuários mongoid é o código nojento:
fonte
.where(email: params[:email]).first
para mim.rescue
sintaxe, pois ela pode ocultar problemas como erros de digitaçãotão simples quanto:
fonte
if user...else
Você pode usar find_by com o atributo necessário (no seu caso, o id). Isso retornará nil ao invés de dar um erro se o id fornecido não for encontrado.
ou você pode usar o novo formato:
Você também pode usar where, mas você precisa saber que where retorna uma relação de registro ativo com zero ou mais registros que você precisa usar primeiro para retornar apenas um registro ou nil no caso de retorno de zero registros.
fonte