मुझे कंट्रोलर ए में कंट्रोलर बी से कॉल एक्शन की जरूरत है।
कारण यह है कि जब मुझे कंट्रोलर बी से कॉल करना हो तो मुझे अलग तरीके से रीडायरेक्ट करना होगा।
क्या यह रेल में किया जा सकता है?
मुझे कंट्रोलर ए में कंट्रोलर बी से कॉल एक्शन की जरूरत है।
कारण यह है कि जब मुझे कंट्रोलर बी से कॉल करना हो तो मुझे अलग तरीके से रीडायरेक्ट करना होगा।
क्या यह रेल में किया जा सकता है?
जवाबों:
आप उस कार्रवाई में पुनर्निर्देशित कर सकते हैं:
redirect_to your_controller_action_url
अधिक पर: रेल गाइड
नई कार्रवाई को प्रस्तुत करने के लिए:
redirect_to your_controller_action_url and return
renderइसके बजाय होना चाहिए redirect_to। आप क्या कहते हैं, @Spyros?
redirect_toउपयोग करने की अनुमति नहीं देता है post: :methodऔर यह विशेष रूप से createकिसी अन्य नियंत्रक की पहले से मौजूद क्रिया को पुनर्निर्देशित करने के लिए विशेष रूप से उपयोगी हो सकता है जैसा कि @ddayan ने पहली बार में पूछा था। मेरे पास एक समान स्थिति है जहां कुछ स्थिति में मुझे एक और वस्तु बनानी चाहिए। अन्य createकार्रवाई को कॉल करना DRYer हो सकता है ..
एक नियंत्रक को दूसरे से उपयोग करने के लिए, यह करें:
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तो आप ऐसा करेंगेcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)JSON को अन्य नियंत्रक से लौटाने के लिए काम करने लगता है
controller_you_want.requestलेकिन इस फायरिंग को हैश या पैरामीटर्स उदाहरण के रूप में प्राप्त करने में असमर्थ थे।
paramsके लिए उपलब्ध हो controller_you_wantनिर्धारित करके request3 लाइन में। क्या आप यही पूछ रहे हैं?
render html: controller_you_want.process(:action_you_want)
आपके द्वारा प्रस्तुत तर्क MVC नहीं है, फिर रेल, संगत नहीं है।
एक नियंत्रक एक दृश्य या पुनर्निर्देशित करता है
एक विधि कोड निष्पादित करता है
इन विचारों से, मैं आपको सलाह देता हूं कि आप अपने नियंत्रक में तरीके बनाएं और उन्हें अपनी कार्रवाई से बुलाएं।
उदाहरण:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
कहा कि आप विभिन्न नियंत्रकों के माध्यम से ठीक वैसा ही कर सकते हैं और नियंत्रक बी से एक विधि को बुला सकते हैं जब आप नियंत्रक बी में होते हैं।
शब्दावली अत्यंत महत्वपूर्ण है इसलिए मैं बहुत जोर देता हूं।
get_variableअब किसी दूसरे कंट्रोलर से कैसे कॉल किया जा सकता है?
आप url_forएक नियंत्रक और कार्रवाई के लिए URL प्राप्त करने के लिए उपयोग कर सकते हैं और फिर redirect_toउस URL पर जाने के लिए उपयोग कर सकते हैं।
redirect_to url_for(:controller => :controller_name, :action => :action_name)
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)में परिणाम होगा /contorller_name/action_name?param1=val1¶m2=val2। डॉक्स
किसी अन्य नियंत्रक कार्रवाई को कॉल करने के लिए यह बुरा अभ्यास है।
तुम्हे करना चाहिए
मेरी राय:
तीसरा दृष्टिकोण वह है जो मैं अक्सर किया करता था। इसलिए मैं थोड़ा उदाहरण दिखाऊंगा।
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
endतो आप इस एक्शन redirect_toपरम को भेज सकते हैं , जो आपके लिए कोई भी रास्ता हो सकता है।
/modelsया एक साधारण वर्ग या मॉड्यूल में /lib) में स्थानांतरित करके, नकल करने से बच सकते हैं । एकमात्र समस्या यह है कि यदि आपका नियंत्रक उदाहरण चर के माध्यम से दृश्य के साथ संचार करता है - तो आपको उस दोहराव को दूसरे तरीके से ठीक करना होगा।
शायद तर्क को एक सहायक में निकाला जा सकता है? सहायक सभी वर्गों के लिए उपलब्ध हैं और नियंत्रण स्थानांतरित नहीं करते हैं। आप इसे देख सकते हैं, शायद नियंत्रक नाम के लिए, यह देखने के लिए कि यह कैसे कहा जाता है।
बचाव के लिए रचना !
कारण को देखते हुए, नियंत्रकों पर कार्रवाई करने के बजाय किसी को कोड के साझा और कस्टम भागों को अलग करने के लिए नियंत्रकों को डिज़ाइन करना चाहिए। यह दोनों कोड दोहराव और एमवीसी पैटर्न को तोड़ने से बचने में मदद करेगा।
यद्यपि यह कई तरीकों से किया जा सकता है, चिंताओं ( रचना ) का उपयोग करना एक अच्छा अभ्यास है।
# 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
उम्मीद है की वो मदद करदे।
इन कार्यों को नियंत्रकों से अलग करें और उन्हें मॉडल फ़ाइल में डालें। फिर अपने नियंत्रक में मॉडल फ़ाइल शामिल करें।