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?
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?
Jawaban:
Anda dapat menggunakan pengalihan ke tindakan itu:
redirect_to your_controller_action_url
Lebih lanjut tentang: Panduan Rel
Untuk hanya membuat tindakan baru:
redirect_to your_controller_action_url and return
render
gantinya redirect_to
. Apa yang Anda katakan, @Spyros?
redirect_to
tidak mengizinkan untuk menggunakan post: :method
dan ini dapat berguna terutama untuk mengarahkan ke tindakan yang sudah ada create
dari pengontrol lain seperti yang diminta @ddayan pada saat pertama. Saya memiliki situasi serupa di mana dalam beberapa situasi saya harus membuat objek lain. Memanggil create
tindakan lain bisa jadi LEBIH KERING ..
Untuk menggunakan satu pengontrol dari yang lain, lakukan ini:
def action_that_calls_one_from_another_controller
controller_you_want = ControllerYouWant.new
controller_you_want.request = request
controller_you_want.response = response
controller_you_want.action_you_want
end
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 lain
controller_you_want.request
tetapi tidak bisa mendapatkan penembakan ini melalui hash atau parameter contoh.
params
menjadi tersedia untuk controller_you_want
dengan menetapkan request
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:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
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.
get_variable
sekarang bisa dipanggil dari pengontrol lain?
Anda dapat menggunakan url_for
untuk mendapatkan URL untuk pengontrol dan tindakan dan kemudian menggunakan redirect_to
untuk pergi ke URL itu.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
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 dokumen
Ini 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.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
Jadi, Anda dapat mengirim ke redirect_to
parameter tindakan ini , yang dapat berupa jalur mana pun yang Anda inginkan.
/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.
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.
# controllers/a_controller.rb
class AController < ApplicationController
include Createable
private def redirect_url
'one/url'
end
end
# controllers/b_controller.rb
class BController < ApplicationController
include Createable
private def redirect_url
'another/url'
end
end
# controllers/concerns/createable.rb
module Createable
def create
do_usefull_things
redirect_to redirect_url
end
end
Semoga membantu.
Pisahkan fungsi-fungsi ini dari pengontrol dan masukkan ke dalam file model. Kemudian sertakan file model di pengontrol Anda.