Rails novo vs criar

195

Por que é necessário definir um novo método no controlador RESTful, segui-lo com um método create?

A pesquisa do Google não me forneceu a resposta que eu estava procurando. Entendo a diferença, mas preciso saber por que eles são usados ​​do jeito que são.

enviado
fonte

Respostas:

263

Na implementação do REST pelo Rails, new e create são tratados de maneira diferente.

Um HTTP GET to /resources/newse destina a renderizar um formulário adequado para criar um novo recurso, o que ele chama chamando o novo ação no controlador, que cria um novo registro não salvo e renderiza o formulário.

Um HTTP POST /resourcespega o registro criado como parte da nova ação e o passa para a ação de criação no controlador, que tenta salvá-lo no banco de dados.

Steve Weet
fonte
1
Eu procurei exatamente essas informações em um site de tutorial sobre trilhos. Não foi até eu realmente usá-lo que se tornou relevante.
precisa saber é o seguinte
248

Na documentação ActiveRecord :: Base :

create (attribute = nil) {| objeto | ...}

Cria um objeto (ou vários objetos) e o salva no banco de dados, se as validações forem aprovadas. O objeto resultante é retornado se o objeto foi salvo com sucesso no banco de dados ou não.

novo (atributos = nil) {| self if block_given? | ...}

Novos objetos podem ser instanciados como vazios (não passar nenhum parâmetro de construção) ou predefinidos com atributos, mas ainda não salvos (passe um hash com nomes de chave que correspondem aos nomes de colunas da tabela associados). Nos dois casos, as chaves de atributo válidas são determinadas pelos nomes das colunas da tabela associada - portanto, você não pode ter atributos que não fazem parte das colunas da tabela.

Então createinstancia o novo objeto, valida e salva-lo para o banco de dados. E newapenas cria o objeto local, mas não tenta validá-lo ou salvá-lo no banco de dados.

Justin Ethier
fonte
5
Esta pergunta é sobre os métodos do controlador, não os métodos do modelo.
Sevenseacat
8
@ Karpie - Obrigado pelo voto negativo. Você faz uma boa observação, mas considere que muitas pessoas acharam essa resposta útil, especialmente porque nem o título nem as tags a chamam de pergunta do controlador. Então, acho que essa resposta fornece valor da mesma forma.
Justin Ethier
16

New instancia uma nova instância de Model, mas não é salva até que o método save seja chamado.

Criar faz o mesmo que novo, mas também o salva no banco de dados.

Às vezes, você deseja fazer alguma coisa antes de salvar algo no banco de dados, às vezes, apenas deseja criar e salvá-lo imediatamente.

ghoppe
fonte
1
Esta pergunta é sobre os métodos do controlador, não os métodos do modelo.
Sevenseacat
11

As partes RESTful do Rails são feitas para estar muito próximas de como o protocolo HTTP funciona. No protocolo HTTP, uma solicitação GET não deve modificar nenhum dado. Logicamente, se você observar como todas as ações RESTful no Rails funcionam, elas corresponderão às ações HTTP. Um POST é para gerar novos dados, por isso é criado logicamente. Você usa um GET para exibir a versão do formulário dessa ou em outras palavras, a nova ação. Index e show também são GETs, update é um PUT (ou PATCH no Rails 4+) e destroy é um DELETE no HTTP.

Além disso, ele separa bem a lógica no controlador e oferece uma maneira fácil de lidar com erros (renderizando novamente a nova ação com mensagens de erro).

Jared
fonte
"You use a GET to serve the form version of that or in other words, the new action"obrigado pela resposta, mas pessoalmente acho essa convenção de nomes realmente confusa
Daniel Lizik