2011-03-29 13 views
7

MyController की foo विधि अजाक्स के माध्यम से कहा जाता है, तो वह इस तरह जावास्क्रिप्ट कोड वापस आ सकते हैं:रेल 3: नियंत्रक से जावास्क्रिप्ट कोड कैसे भेजें?

class MyController < ApplicationController 
    def foo 
    render :js => "alert('Hello');" 
    end 
end 

एक जावास्क्रिप्ट कोड जब foo सामान्य रूप से कहा जाता है (अजाक्स के माध्यम से नहीं) वापस जाने के लिए इसी तरह के कुछ करने के लिए संभव है कि है? मैं ऐसा कुछ करना चाहता हूं:

class Job < ApplicationController 
    def edit 
    if user_type == 'demo' 
     [Here I would like to display a Javascript alert saying that 
     the job cannot be edited in demo mode. How would you do this?] 
    else 
     @job = Job.find(params[:id]) 
    end 
    end 
end 
+0

आप रेल का standart उपयोग और HTTP – fl00r

उत्तर

5

संक्षिप्त उत्तर है: आप नहीं कर सकते।

जब आप इसके लिए प्रस्तुत करते हैं: जेएस, कॉलिंग कोड एक जावास्क्रिप्ट ढांचा है जो जानता है कि उसने जेएस से अनुरोध किया है और यह असरदार कॉल निष्पादित करता है जब यह असुरक्षित कॉल निष्पादित करता है।

डिफ़ॉल्ट के लिए प्रतिपादन करते समय, कॉलिंग कोड ब्राउज़र है जो HTML की अपेक्षा करता है कि यह शुद्ध जेएस निष्पादित नहीं करेगा।

आप क्या कर सकते हैं एक window.onload() हैंडलर यह चेतावनी प्रदर्शित करने के लिए परिभाषित के साथ शुरुआत में कुछ जावास्क्रिप्ट के साथ अपने दृश्य वापसी एचटीएमएल बनाते हैं। लेकिन आपको अभी भी एचटीएमएल वापस करना है (यदि आप डेटा को प्रदर्शित नहीं करना चाहते हैं, तो इसे एक विशिष्ट तर्क के साथ पिछले दृश्य टेम्पलेट पर रीडायरेक्ट करें ताकि दृश्य में ईवेंट हैंडलर हो) (https://stackoverflow.com/questions/1033398/execute-javascript-when-page-has-fully-loaded)

आप इवेंट हैंडलर भी बदल सकता है जो क्रिया निष्पादित होने से पहले भी चेतावनी प्रदर्शित करने के लिए संपादन कार्रवाई को कॉल करता है। किसी उपयोगकर्ता को जेएस को अक्षम करने और अलर्ट प्राप्त करने से रोकने के लिए, आपको अभी भी user_type पर चेक करना होगा और शायद पिछले पृष्ठ पर रीडायरेक्ट करना होगा।

+0

के खिलाफ जा रहे हैं वह 'प्रस्तुत करना का उपयोग कर सकते हैं: – fl00r

+0

update' के रूप में मैं यह प्रारूप को समझने उनके अनुरोध का _not_ है: जेएस। यह एचटीएमएल है। इस मामले में: अद्यतन उसके लिए बेकार है क्योंकि मुझे नहीं लगता कि वह प्रस्तुत कर सकता है: प्रारूप के लिए अद्यतन: एचटीएमएल, इसलिए मेरा जवाब ... – Jean

+0

ओह, मुझे मिल गया। मैंने सवाल के मुख्य विचार को याद किया है। +1।वह नहीं कर सकता :) – fl00r

3

मेरा सुझाव है कि आप अपने नियंत्रक को साफ रखने और एक RJS टेम्पलेट में कोई JavaScript कोड:

नियंत्रक

class MyController < ApplicationController 
    def edit 
     render do |page| 
     page.html {} 
     page.js {} 
     end 
    end 
end 

edit.js.erb

alert("hello"); 

जब भी /my/edit/1.js कहा जाता है (के माध्यम से: edit_my_path(1, :format => :js)) ई dit.js.erb को एक चेतावनी प्रदर्शित करने के लिए प्रस्तुत किया जाएगा।

जब भी /my/edit/1.js कहा जाता है (के माध्यम से: edit_my_path(1)) edit.html.erb सामान्य HTML प्रदर्शित करने के लिए प्रस्तुत किया जाएगा।

आप क्या अनुरोध ajax है (और इस तरह नहीं सिर्फ एक सामान्य .js कहते हैं) की जांच करने की आवश्यकता होगी, तो आप अपने नियंत्रक में कर सकता है: request.xhr?

आशा है कि मदद करता है!

+0

प्रश्न से: वह अनुरोध करना चाहता है जब अनुरोध _not_ xhr ... – Jean

+0

@jean दोनों तरीकों से काम करता है। –

+0

जो वह चाहता है, वह हमेशा सामान्य एचटीएमएल को कॉल करेगा (उसने कहा: xhr नहीं) इस प्रकार यह हमेशा सामान्य एचटीएमएल प्रदर्शित करेगा चाहे उपयोगकर्ता_टाइप डेमो है या नहीं। वह संभवतः "शो" टेम्पलेट पेज में एक शर्त जांच का उपयोग कर सकता है और user_type डेमो के लिए जेएस प्रारूप का उपयोग कर सकता है लेकिन यह आपके उत्तर से स्पष्ट नहीं है ... – Jean

0

आप बस पाठ के रूप में जावास्क्रिप्ट प्रदान कर सकते हैं जब js प्रारूप का अनुरोध किया है

class MyController < ApplicationController 
    def update 
     respond_to do |format| 
     format.html {} 
     format.js { render text: 'alert();' } 
     end 
    end 
end 
+0

ऐसा लगता है कि एक एक्शन व्यू :: MissingTemplate: गुम टेम्पलेट संसाधन_नाम/अलर्ट(); – Magne

संबंधित मुद्दे