रेल्स: एक कंट्रोलर से दूसरे कंट्रोलर एक्शन को कॉल करें


118

मुझे कंट्रोलर ए में कंट्रोलर बी से कॉल एक्शन की जरूरत है।

कारण यह है कि जब मुझे कंट्रोलर बी से कॉल करना हो तो मुझे अलग तरीके से रीडायरेक्ट करना होगा।

क्या यह रेल में किया जा सकता है?


2
के संभावित डुप्लिकेट stackoverflow.com/questions/4581269/... और stackoverflow.com/questions/3370234/...
राहेल Shallit

क्या आप POST या GET कार्रवाई के बारे में बोल रहे हैं? अगर आपको लगता है कि आप उस कार्रवाई को पुनर्निर्देशित कर सकते हैं। लेकिन इसका कारण शांत नहीं है क्योंकि आप नियंत्रक ए से पुनर्निर्देशित कर सकते हैं जो भी आपको चाहिए।
वोल्डी

जवाबों:


64

आप उस कार्रवाई में पुनर्निर्देशित कर सकते हैं:

redirect_to your_controller_action_url

अधिक पर: रेल गाइड

नई कार्रवाई को प्रस्तुत करने के लिए:

redirect_to your_controller_action_url and return

5
मुझे खेद है लेकिन क्या आप बता सकते हैं कि पहली पंक्ति और दूसरी पंक्ति में क्या अंतर है? मुझे लगता है कि पहले कोड की शेष लाइनों को निष्पादित करेगा और फिर रीडायरेक्ट करेगा। क्या वो सही है?
अक्स

मुझे लगता है कि शायद आखिरी उदाहरण एक टाइपो था और renderइसके बजाय होना चाहिए redirect_to। आप क्या कहते हैं, @Spyros?
मैग्ने

1
Hi @spyros, redirect_toउपयोग करने की अनुमति नहीं देता है post: :methodऔर यह विशेष रूप से createकिसी अन्य नियंत्रक की पहले से मौजूद क्रिया को पुनर्निर्देशित करने के लिए विशेष रूप से उपयोगी हो सकता है जैसा कि @ddayan ने पहली बार में पूछा था। मेरे पास एक समान स्थिति है जहां कुछ स्थिति में मुझे एक और वस्तु बनानी चाहिए। अन्य createकार्रवाई को कॉल करना DRYer हो सकता है ..
SanjiBukai

53

एक नियंत्रक को दूसरे से उपयोग करने के लिए, यह करें:

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

18
यदि आप चाहते हैं कि कॉलबैक को अभी भी निष्पादित किया जाए controller_you_wantतो आप ऐसा करेंगेcontroller_you_want.process(:action_you_want)
कॉन्स्टेंटिजेन शेपेंस

3
धन्यवाद! यह उन परिस्थितियों के लिए बहुत उपयोगी है जहां आप पुनर्निर्देशित नहीं करना चाहते हैं, आपको बस एक नियंत्रक से दूसरे नियंत्रक पर कार्रवाई करने के लिए त्वरित समाधान की आवश्यकता है। पुनर्निर्देशन वास्तव में कुछ अलग है। इसके अलावा: render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)JSON को अन्य नियंत्रक से लौटाने के लिए काम करने लगता है
Yourpalal

1
महान जवाब, बस मैं क्या देख रहा था। एक सवाल - क्या प्रारूप अनुरोध करता है कि मापदंडों को यहां लेने की आवश्यकता होगी? मुझे लगता है कि वे जीवित रहते हैं, controller_you_want.requestलेकिन इस फायरिंग को हैश या पैरामीटर्स उदाहरण के रूप में प्राप्त करने में असमर्थ थे।
एसआरएके

मुझे यकीन नहीं है कि आप @SRack से क्या पूछ रहे हैं। paramsके लिए उपलब्ध हो controller_you_wantनिर्धारित करके request3 लाइन में। क्या आप यही पूछ रहे हैं?
सैमी लार्बी

1
रेल में 5 की कोशिश की, यह प्रतिपादन के लिए होना चाहिएrender html: controller_you_want.process(:action_you_want)
nazar kuliyev

41

आपके द्वारा प्रस्तुत तर्क MVC नहीं है, फिर रेल, संगत नहीं है।

  • एक नियंत्रक एक दृश्य या पुनर्निर्देशित करता है

  • एक विधि कोड निष्पादित करता है

इन विचारों से, मैं आपको सलाह देता हूं कि आप अपने नियंत्रक में तरीके बनाएं और उन्हें अपनी कार्रवाई से बुलाएं।

उदाहरण:

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

कहा कि आप विभिन्न नियंत्रकों के माध्यम से ठीक वैसा ही कर सकते हैं और नियंत्रक बी से एक विधि को बुला सकते हैं जब आप नियंत्रक बी में होते हैं।

शब्दावली अत्यंत महत्वपूर्ण है इसलिए मैं बहुत जोर देता हूं।


मुझे पता है कि मुझे ऐसा नहीं करना चाहिए, लेकिन यह मेरे आवेदन का हिस्सा नहीं है, यह सिर्फ मेरे आवेदन के परीक्षण और मूल्यांकन के लिए है।
दिनमान

9
इसे प्यार करें .. रेंडर से विधि को अलग करें, और फिर जहां आवश्यक हो अलग-अलग विधि को कॉल करें। बस एक सवाल .. get_variableअब किसी दूसरे कंट्रोलर से कैसे कॉल किया जा सकता है?
फ्लोटिंगरॉक

1
@FloatingRock ने सिर्फ आपके प्रश्न / टिप्पणी पर ध्यान दिया: आपके पास कई विकल्प हैं: आम पूर्वज में परिभाषित किया जा सकता है या आप सामान्य
मिक्सिन

जवाब प्यार, अनुगामी वाक्य टुकड़ा के बारे में अनिश्चित
जेरार्ड सिम्पसन

30

आप url_forएक नियंत्रक और कार्रवाई के लिए URL प्राप्त करने के लिए उपयोग कर सकते हैं और फिर redirect_toउस URL पर जाने के लिए उपयोग कर सकते हैं।

redirect_to url_for(:controller => :controller_name, :action => :action_name)

1
दूसरे ने मेरे लिए काम नहीं किया, यह बेहतर लग रहा है, लेकिन हम मापदंडों को कैसे पारित करते हैं?
एमएसंजय

3
@msanjay आप उन्हें url_for के अन्य मापदंडों के रूप में पास कर सकते हैं। उदाहरण के लिए redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)में परिणाम होगा /contorller_name/action_name?param1=val1&param2=val2डॉक्स
एरियल एलोन

अगर मैं "MyOtherController" जैसे रूट कंट्रोलर को "Module :: MyController" जैसे कंट्रोलर से रिडायरेक्ट करने का प्रयास करता हूं .. तो यह "मॉड्यूल / MyOtherController" कॉल करने का संकल्प करेगा। कोई भी विचार है कि मैं रूट को कैसे कॉल कर सकता हूं?
ggez44

12

किसी अन्य नियंत्रक कार्रवाई को कॉल करने के लिए यह बुरा अभ्यास है।

तुम्हे करना चाहिए

  1. इस क्रिया को अपने नियंत्रक B, या में डुप्लिकेट करें
  2. इसे एक मॉडल विधि के रूप में लपेटें, जो सभी नियंत्रकों को साझा किया जाएगा, या
  3. आप इस क्रिया को कंट्रोलर ए में बढ़ा सकते हैं।

मेरी राय:

  1. पहला दृष्टिकोण डीआरवाई नहीं है लेकिन यह अभी भी एक और कार्रवाई के लिए कॉल करने से बेहतर है।
  2. दूसरा दृष्टिकोण अच्छा और लचीला है।
  3. तीसरा दृष्टिकोण वह है जो मैं अक्सर किया करता था। इसलिए मैं थोड़ा उदाहरण दिखाऊंगा।

    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परम को भेज सकते हैं , जो आपके लिए कोई भी रास्ता हो सकता है।


नमस्ते, समाधान बी के लिए एक मॉडल विधि के रूप में लपेटो, कैसे लपेटो अगर कोई मॉडल बिल्कुल नहीं है? हम एक खोज इंजन पर काम कर रहे हैं और अन्य इंजनों से खोज इंजन में खोज विचारों को कॉल करना चाहेंगे। खोज कार्रवाई के लिए कोई डेटा मॉडल नहीं है।
209

@ user938363 - हो सकता है कि दोनों क्रियाएं एक ही दृश्य को प्रस्तुत करती हों (भले ही वे क्रियाएं अलग-अलग नियंत्रकों में हों)। "रेंडर" कॉल खुद डुप्लिकेट होगी लेकिन यह अपने आप में डुप्लिकेट की केवल एक पंक्ति है - इतना बुरा नहीं है। यदि आपके पास बहुत सारे तर्क हैं जो रेंडर कॉल को पास करने के लिए मापदंडों के हैश को तैयार करता है, तो आप इसे अपनी खुद की फ़ाइल (शायद एक मॉडल /modelsया एक साधारण वर्ग या मॉड्यूल में /lib) में स्थानांतरित करके, नकल करने से बच सकते हैं । एकमात्र समस्या यह है कि यदि आपका नियंत्रक उदाहरण चर के माध्यम से दृश्य के साथ संचार करता है - तो आपको उस दोहराव को दूसरे तरीके से ठीक करना होगा।
एंटीइनोम

क्या होगा यदि आपके पास एक UserController है जो एक नया उपयोगकर्ता (पंजीकरण) बनाता है और सफलता पर आप एक SessionController और उपयोगकर्ता को प्रमाणित करना चाहते हैं? इस मामले में आप एक तरह से या किसी अन्य सत्र का आह्वान करते हैं। इस पर कोई विचार?
डिपोले_मोमेंट

यह एक बुरा अभ्यास क्यों है? सैमी लाम्बी के जवाब में क्या समस्या है?
vasilakisfil

7

शायद तर्क को एक सहायक में निकाला जा सकता है? सहायक सभी वर्गों के लिए उपलब्ध हैं और नियंत्रण स्थानांतरित नहीं करते हैं। आप इसे देख सकते हैं, शायद नियंत्रक नाम के लिए, यह देखने के लिए कि यह कैसे कहा जाता है।


6

बचाव के लिए रचना !

कारण को देखते हुए, नियंत्रकों पर कार्रवाई करने के बजाय किसी को कोड के साझा और कस्टम भागों को अलग करने के लिए नियंत्रकों को डिज़ाइन करना चाहिए। यह दोनों कोड दोहराव और एमवीसी पैटर्न को तोड़ने से बचने में मदद करेगा।

यद्यपि यह कई तरीकों से किया जा सकता है, चिंताओं ( रचना ) का उपयोग करना एक अच्छा अभ्यास है।

# 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

उम्मीद है की वो मदद करदे।


2

आप एक एक्शन के अंदर किसी अन्य एक्शन को कॉल कर सकते हैं:

पुनर्निर्देशन की कार्रवाई: 'कार्रवाई_नाम'

class MyController < ApplicationController
  def action1
   redirect_to action: 'action2'
  end

  def action2
  end
end

-6

इन कार्यों को नियंत्रकों से अलग करें और उन्हें मॉडल फ़ाइल में डालें। फिर अपने नियंत्रक में मॉडल फ़ाइल शामिल करें।


बुरा सुझाव। जिम्मेदारियों से खिलवाड़ करेंगे, एमवीसी को इंगित करेंगे। मॉडल आदि में सत्र / कुकी कॉल के साथ समस्याएँ
ऐन तोहवरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.