Então, eu tenho visto pessoas usando .build, .create e .create! nos controladores cada vez mais ultimamente. Qual é a diferença de apenas usar .new e passig o objeto param'd e depois .save? Existem prós e contras? O uso desses outros métodos oferece benefícios?
ruby-on-rails
Tim Knight
fonte
fonte
Embora seja correto que
create
chamanew
e, em seguida,save
há uma grande diferença entre as duas alternativas em seus valores de retorno.Save
retorna umtrue
oufalse
dependendo se o objeto foi salvo com sucesso no banco de dados ou não. Isso pode ser usado para controle de fluxo, conforme o primeiro exemplo da pergunta acima.Create
retornará o modelo independentemente de o objeto ter sido salvo ou não. Isso tem implicações para o código acima, pois a ramificação superior daif
instrução sempre será executada mesmo se o objeto falhar nas validações e não for salvo.Se você usa
create
a lógica de ramificação, corre o risco de falhas silenciosas, o que não é o caso se você usarnew
+save
.create!
não sofre do mesmo problema que gera e exceção se o registro for inválido.A
create
alternativa pode ser útil em controladores onderespond_with
é usado para respostas de API (JSON / XML). Nesse caso, a existência de erros no objeto fará com que os erros sejam retornados na resposta com um status deunprocessable_entity
, que é exatamente o que você deseja de uma API.Eu sempre usaria a opção
new
+save
para html, especialmente se você estiver contando com o valor de retorno para controle de fluxo.fonte
#create é uma versão mais curta do novo e salva. #crio! está lançando uma exceção se a validação não for positiva.
fonte
Eu segundo as respostas acima. Além disso
create
, não se pode passarfalse
como argumento com o qual você pode fazersave
. Passarfalse
como argumento ignorará todas as validações de trilhosfonte