Rails baru vs buat

195

Mengapa ada kebutuhan untuk mendefinisikan metode baru di RESTful controller, ikuti dengan metode create?

Pencarian Google tidak memberikan saya jawaban yang saya cari. Saya mengerti perbedaannya, tetapi perlu tahu mengapa mereka digunakan sebagaimana adanya.

dikirim-hil
sumber

Jawaban:

263

Dalam penerapan Rails REST yang baru dan dibuat diperlakukan secara berbeda.

HTTP GET to /resources/newdimaksudkan untuk membuat formulir yang cocok untuk membuat sumber daya baru, yang dilakukannya dengan memanggil tindakan baru di dalam pengontrol, yang membuat catatan yang belum disimpan baru dan membuat formulir.

HTTP POST untuk /resourcesmengambil catatan yang dibuat sebagai bagian dari tindakan baru dan meneruskannya ke tindakan buat di dalam pengontrol, yang kemudian mencoba untuk menyimpannya ke database.

Steve Weet
sumber
1
Saya membaca sekilas informasi ini di situs tutorial rel. Bukankah sampai saya benar-benar menggunakannya itu menjadi relevan.
StorymasterQ
248

Dari dokumentasi ActiveRecord :: Base :

buat (atribut = nil) {| objek | ...}

Membuat objek (atau beberapa objek) dan menyimpannya ke database, jika validasi lulus. Objek yang dihasilkan dikembalikan apakah objek berhasil disimpan ke database atau tidak.

baru (atribut = nil) {| self if block_given? | ...}

Objek baru dapat dipakai sebagai kosong (lewat tidak ada parameter konstruksi) atau pra-set dengan atribut tetapi belum disimpan (lulus hash dengan nama-nama kunci yang cocok dengan nama kolom tabel terkait). Dalam kedua kasus, kunci atribut yang valid ditentukan oleh nama kolom dari tabel terkait - maka Anda tidak dapat memiliki atribut yang bukan bagian dari kolom tabel.

Jadi createinstantiate objek baru, validasikan, dan simpan ke database. Dan newhanya membuat objek lokal tetapi tidak berusaha untuk memvalidasi atau menyimpannya ke DB.

Justin Ethier
sumber
5
Pertanyaan ini adalah tentang metode pengontrol, bukan metode model.
sevenseacat
8
@Karpie - Terima kasih untuk downvote. Anda membuat poin yang bagus, tetapi pertimbangkan bahwa banyak orang menemukan jawaban ini berguna, terutama karena judul atau tag tidak menyebutnya sebagai pertanyaan khusus pengontrol. Jadi saya pikir jawaban ini memberikan nilai yang sama.
Justin Ethier
16

Baru instantiates instance Model baru, tetapi tidak disimpan sampai metode penyimpanan dipanggil.

Buat melakukan hal yang sama seperti baru, tetapi juga menyimpannya ke database.

Terkadang Anda ingin melakukan hal-hal sebelum menyimpan sesuatu ke database, kadang-kadang Anda hanya ingin membuat dan menyimpannya segera.

ghoppe
sumber
1
Pertanyaan ini adalah tentang metode pengontrol, bukan metode model.
sevenseacat
11

Bagian RESTful Rails dibuat sangat dekat dengan cara kerja protokol HTTP. Dalam protokol HTTP, permintaan GET tidak seharusnya mengubah data apa pun. Secara logis, jika Anda melihat cara semua tindakan RESTful di Rails bekerja, mereka akan cocok dengan tindakan HTTP. POST adalah untuk menghasilkan data baru, sehingga secara logis dibuat. Anda menggunakan GET untuk melayani versi bentuk dari itu atau dengan kata lain, tindakan baru. Indeks dan pertunjukan juga GET, pembaruan adalah PUT (atau PATCH di Rails 4+), dan menghancurkan adalah HAPUS dalam HTTP.

Selain itu, ia dengan baik memisahkan logika dalam pengontrol dan memberi Anda cara yang mulus untuk mengatasi kesalahan (dengan merender ulang tindakan baru dengan pesan kesalahan).

Jared
sumber
"You use a GET to serve the form version of that or in other words, the new action"terima kasih atas jawabannya tetapi secara pribadi saya menemukan konvensi penamaan ini benar-benar membingungkan
Daniel Lizik