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
renderonun yerine olmalı redirect_to. Ne diyorsun @Spyros?
redirect_tokullanımına izin vermiyor post: :methodve 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 createeylemi ç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_wantistiyorsanı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.requestancak bu ateşlemeyi bir hash veya parametreler örneğini geçiremedi.
paramsİçin kullanılabilir hale controller_you_wantayarlayarak request3 ç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_forbir denetleyici ve eylem için URL almak ve daha sonra kullanmak redirect_too 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
endBöylece redirect_to, istediğiniz herhangi bir yol olabilecek bu eylem parametresine gönderebilirsiniz .
/modelsveya 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.