B denetleyicisinden denetleyici A'daki oluşturma eylemini çağırmam gerekiyor.
Bunun nedeni, denetleyici B'den aradığımda farklı bir şekilde yeniden yönlendirmem gerektiğidir.
Rails'de yapılabilir mi?
B denetleyicisinden denetleyici A'daki oluşturma eylemini çağırmam gerekiyor.
Bunun nedeni, denetleyici B'den aradığımda farklı bir şekilde yeniden yönlendirmem gerektiğidir.
Rails'de yapılabilir mi?
Yanıtlar:
Bu eyleme bir yönlendirme kullanabilirsiniz:
redirect_to your_controller_action_url
Daha fazlası: Ray Kılavuzu
Yalnızca yeni eylemi oluşturmak için:
redirect_to your_controller_action_url and return
render
onun yerine olmalı redirect_to
. Ne diyorsun @Spyros?
redirect_to
kullanımına izin vermiyor post: :method
ve bu, create
@ddayan'ın ilk seferinde sorduğu gibi, başka bir denetleyicinin zaten var olan bir eylemine yönlendirmek için özellikle yararlı olabilir . Bazı durumlarda başka bir nesne yaratmam gereken benzer bir durumum var. Diğer create
eylemi çağırmak DRYer olabilir ..
Bir denetleyiciyi diğerinden kullanmak için şunu yapın:
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
istiyorsanız, yapardınızcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
diğer denetleyiciden
controller_you_want.request
ancak bu ateşlemeyi bir hash veya parametreler örneğini geçiremedi.
params
İçin kullanılabilir hale controller_you_want
ayarlayarak request
3 çizgide. Sorduğun bu mu?
render html: controller_you_want.process(:action_you_want)
Sunduğunuz mantık MVC değil, Rails değil, uyumlu.
Bir denetleyici bir görünüm veya yönlendirme oluşturur
Bir yöntem kodu yürütür
Bu düşüncelerden, denetleyicinizde yöntemler oluşturmanızı ve bunları eyleminizden çağırmanızı öneririm.
Misal:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
Bununla birlikte, aynı şeyi farklı denetleyiciler aracılığıyla yapabilir ve denetleyici B'deyken denetleyici A'dan bir yöntem çağırabilirsiniz .
Kelime dağarcığı son derece önemlidir, bu yüzden çok ısrar ediyorum.
get_variable
şimdi başka bir denetleyiciden nasıl çağrılabilir?
Sen kullanabilirsiniz url_for
bir denetleyici ve eylem için URL almak ve daha sonra kullanmak redirect_to
o URL'ye gitmek için.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
sonuçlanacak /contorller_name/action_name?param1=val1¶m2=val2
. Belgelere
Bu, başka bir denetleyici eylemi çağırmak için kötü bir uygulamadır.
Malısın
Benim fikrim:
Üçüncü yaklaşım, sık sık yaptığım şeydi. Bu yüzden küçük bir örnek göstereceğim.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
Böylece redirect_to
, istediğiniz herhangi bir yol olabilecek bu eylem parametresine gönderebilirsiniz .
/models
veya sıradan bir sınıf veya modül içerisine /lib
) kopyalamayı önleyebilirsiniz . Tek sorun, denetleyiciniz görünüm ile örnek değişkenleri aracılığıyla iletişim kuruyorsa - bu yinelemeyi başka bir şekilde düzeltmeniz gerekir.
Belki mantık bir yardımcıya dönüştürülebilir? yardımcılar tüm sınıflar için mevcuttur ve kontrolü aktarmazlar. Nasıl çağrıldığını görmek için, belki de denetleyici adını kontrol edebilirsiniz.
Kurtarma için kompozisyon !
Nedeni göz önüne alındığında, denetleyiciler arasında eylemleri başlatmak yerine, kodun paylaşılan ve özel bölümlerini ayırmak için denetleyiciler tasarlanmalıdır. Bu, hem kod tekrarını hem de MVC modelini kırmayı önlemeye yardımcı olacaktır.
Bu birkaç yolla yapılabilmesine rağmen, endişeleri ( kompozisyon ) kullanmak iyi bir uygulamadır.
# 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
Umarım yardımcı olur.
Bu işlevleri denetleyicilerden ayırın ve model dosyasına koyun. Ardından model dosyasını kontrol cihazınıza ekleyin.