Saya perlu memanggil tindakan buat di pengontrol A, dari pengontrol B.
Alasannya adalah saya perlu mengalihkan secara berbeda ketika saya menelepon dari pengontrol B.
Bisakah itu dilakukan di Rails?
ruby-on-rails
ddayan
sumber
sumber
Jawaban:
Anda dapat menggunakan pengalihan ke tindakan itu:
Lebih lanjut tentang: Panduan Rel
Untuk hanya membuat tindakan baru:
sumber
render
gantinyaredirect_to
. Apa yang Anda katakan, @Spyros?redirect_to
tidak mengizinkan untuk menggunakanpost: :method
dan ini dapat berguna terutama untuk mengarahkan ke tindakan yang sudah adacreate
dari pengontrol lain seperti yang diminta @ddayan pada saat pertama. Saya memiliki situasi serupa di mana dalam beberapa situasi saya harus membuat objek lain. Memanggilcreate
tindakan lain bisa jadi LEBIH KERING ..Untuk menggunakan satu pengontrol dari yang lain, lakukan ini:
sumber
controller_you_want
Anda akan melakukannyacontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
tampaknya berfungsi untuk mengembalikan JSON dari pengontrol laincontroller_you_want.request
tetapi tidak bisa mendapatkan penembakan ini melalui hash atau parameter contoh.params
menjadi tersedia untukcontroller_you_want
dengan menetapkanrequest
di garis-3. Itukah yang kamu tanyakan?render html: controller_you_want.process(:action_you_want)
Logika yang Anda sajikan bukanlah MVC, bukan Rails, yang kompatibel.
Sebuah pengontrol membuat tampilan atau pengalihan
Sebuah metode menjalankan kode
Dari pertimbangan ini, saya menyarankan Anda untuk membuat metode di pengontrol Anda dan memanggilnya dari tindakan Anda.
Contoh:
Yang mengatakan Anda dapat melakukan hal yang persis sama melalui pengontrol yang berbeda dan memanggil metode dari pengontrol A saat Anda berada di pengontrol B.
Kosakata sangat penting, itulah mengapa saya bersikeras.
sumber
get_variable
sekarang bisa dipanggil dari pengontrol lain?Anda dapat menggunakan
url_for
untuk mendapatkan URL untuk pengontrol dan tindakan dan kemudian menggunakanredirect_to
untuk pergi ke URL itu.sumber
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
akan menghasilkan/contorller_name/action_name?param1=val1¶m2=val2
. Lihat dokumenIni adalah praktik yang buruk untuk memanggil tindakan pengontrol lainnya.
Kamu harus
Pendapat saya:
Pendekatan ketiga adalah apa yang sering saya lakukan. Jadi saya akan menunjukkan sedikit contoh.
Jadi, Anda dapat mengirim ke
redirect_to
parameter tindakan ini , yang dapat berupa jalur mana pun yang Anda inginkan.sumber
/models
atau kelas biasa atau modul di/lib
). Satu-satunya masalah adalah jika pengontrol Anda berkomunikasi dengan view melalui variabel instan - Anda harus memperbaiki duplikasi itu dengan cara lain.Mungkin logika bisa diekstraksi menjadi penolong? pembantu tersedia untuk semua kelas dan tidak mentransfer kontrol. Anda dapat memeriksa di dalamnya, mungkin untuk nama pengontrol, untuk melihat bagaimana itu dipanggil.
sumber
Komposisi untuk menyelamatkan!
Mengingat alasannya, daripada meminta tindakan di seluruh pengontrol, seseorang harus merancang pengontrol untuk memisahkan bagian kode yang dibagikan dan kustom. Ini akan membantu menghindari keduanya - duplikasi kode dan pemutusan pola MVC.
Meskipun itu bisa dilakukan dengan berbagai cara, menggunakan perhatian ( komposisi ) adalah praktik yang baik.
Semoga membantu.
sumber
Anda dapat memanggil tindakan lain di dalam tindakan sebagai berikut:
redirect_to action: 'action_name'
sumber
Pisahkan fungsi-fungsi ini dari pengontrol dan masukkan ke dalam file model. Kemudian sertakan file model di pengontrol Anda.
sumber