Saya punya pertanyaan dua bagian tentang form_for dan sumber daya bersarang. Katakanlah saya sedang menulis mesin blog dan saya ingin menghubungkan komentar dengan sebuah artikel. Saya telah mendefinisikan sumber daya bersarang sebagai berikut:
map.resources :articles do |articles|
articles.resources :comments
end
Formulir komentar ada di tampilan show.html.erb untuk artikel, di bawah artikel itu sendiri, misalnya seperti ini:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Ini memberikan kesalahan, "Called id for nil, yang keliru dll." Saya juga sudah mencoba
<% form_for @article, @comment do |f| %>
Yang merender dengan benar tetapi menghubungkan f.text_area ke bidang 'teks' artikel, bukan komentar, dan menyajikan html untuk atribut article.text di area teks itu. Jadi sepertinya saya juga salah. Yang saya inginkan adalah formulir yang 'kirim' akan memanggil tindakan buat di CommentsController, dengan article_id di params, misalnya permintaan posting ke / artikel / 1 / komentar.
Bagian kedua dari pertanyaan saya adalah, bagaimana cara terbaik untuk membuat contoh komentar untuk memulai? Saya membuat @comment dalam aksi pertunjukan dari ArticleController, jadi objek komentar akan berada dalam ruang lingkup untuk form_for helper. Kemudian dalam tindakan create dari CommentsController, saya membuat @comment baru menggunakan params yang dilewatkan dari form_for.
Terima kasih!
sumber
[@result, @course]
bekerja, tetapiform_for(@result, url: { action: "create" })
juga bekerja. Ini hanya membutuhkan nama model terakhir dan nama metode.Pastikan kedua objek dibuat di controller:
@post
dan@comment
untuk postingan, misalnya:Kemudian dalam tampilan:
Pastikan untuk secara eksplisit mendefinisikan array di form_for, tidak hanya dipisahkan dengan koma seperti yang Anda miliki di atas.
sumber
Anda tidak perlu melakukan hal-hal khusus dalam formulir. Anda cukup membuat komentar dengan benar di aksi pertunjukan:
dan kemudian buat formulir untuk itu di tampilan artikel:
secara default, komentar ini akan menuju ke
create
tindakanCommentsController
, yang mungkin ingin Anda masukkanredirect :back
ke dalam sehingga Anda diarahkan kembali keArticle
halaman.sumber
form_for([@article, @new_comment])
format. Saya pikir ini karena saya menunjukkan pandangancomments#new
, bukanarticle#new_comment
. Saya pikirarticle#new_comment
Rails cukup pintar untuk mengetahui objek komentar yang bersarang dan Anda tidak perlu menentukannya?