2012-04-01 33 views
9

के बाद रीडायरेक्ट करें मुझे दूरस्थ => सत्य के साथ एक फ़ॉर्म मिला है। और अभी मेरी नियंत्रक लगता है:सफल AJAX फ़ॉर्म

# POST /items 
    # POST /items.json 
    def create 
    @item = @store.items.build(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to edit_admin_item_path(@item), :flash => {:success => "#{@item.name} was successfully created."} } 
     format.js { render :js => "window.location.href = ('#{edit_admin_item_path(@item)}');"} 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.js { render :partial => 'fail_create.js.erb', :locals => { :ajax_errors => @item.errors.full_messages } } 
     format.json { render json: @item.errors, status: :unprocessable_entity }  
     end 
    end 
    end 

कौन सा काम करता है लेकिन बहुत अनाड़ी लगता है। यह मुझे फ्लैश नोटिस का उपयोग करने की इजाजत नहीं देता है, जो वास्तव में दुखद समय है।

आदर्श रूप में मुझे लगता है। जैसे मैं बस format.js {redirect_to ...} का उपयोग "या अनुरोध शीर्षकों और redirect_to के खिलाफ जांच करने के लिए सक्षम होना चाहिए शीश!

मुझे यकीन है कि क्या सबसे अच्छा समाधान है नहीं कर रहा हूँ कोई सलाह बहुत बढ़िया होगी, अग्रिम धन्यवाद!

- पीएस - मुझे पता है कि यह कुछ हद तक पहले से पूछा गया है लेकिन इसका कोई फायदा नहीं हुआ है: How to redirect after a successful AJAX form submission। ऐसे कई प्रश्न हैं जो आसपास के आसपास तैरते हैं, लेकिन कोई वास्तविक समाधान नहीं है।

+0

शायद मुझे कुछ याद आ रहा है, लेकिन AJAX फॉर्म सबमिशन का पूरा बिंदु नहीं है कि इसे * पृष्ठ लोड की आवश्यकता नहीं है? अगर आप रीडायरेक्ट करने जा रहे हैं, तो क्या आप पुराने-पुराने सबमिट भी नहीं कर सकते हैं? – jimw

+0

AJAX का उपयोग सत्यापन और डुप्लिकेट रिकॉर्ड की जांच के लिए किया जाता है। फिर एक त्रुटि संदेश के साथ अद्यतन करें। जब फॉर्म सफल होता है, तो मैं संपादन_पैथ पर रीडायरेक्ट करना चाहता हूं। जिसमें छवि अपलोडिंग और अन्य सामान चल रहा है। – Galaxy

+0

ठीक है, लेकिन आप AJAX सबमिशन के बिना जेएस फॉर्म सत्यापन कर सकते हैं। AJAX के माध्यम से सबमिट करने का एकमात्र कारण पृष्ठ लोड से बचने के लिए है। – jimw

उत्तर

5

मुझे लगता है कि यह असंभव हो सकता है। अजाक्स अनुरोध की प्रतिक्रिया XMLHttpRequest द्वारा संसाधित की जाती है। यदि कोई 3xx प्रतिक्रिया लौटा दी जाती है, तो XMLHttpRequest रीडायरेक्ट का पालन करेगा, अगर यूआरएल एक ही उत्पत्ति का है। कोई फर्क नहीं पड़ता कि आप हेडर सेट कैसे करते हैं, ब्राउज़र इसके बारे में अवगत नहीं हो सकता है। तो एकमात्र तरीका खिड़की बदल रहा है। कुछ जावास्क्रिप्ट के साथ स्थान।

+0

हेडर सेट करना वह था जो मैं मूल रूप से करना चाहता था। ऐसा लगता है कि यह नहीं किया जा सकता है! – Galaxy

+2

हेडर सेट करना रेल मार्ग नहीं है; इसलिए, मैं उस मार्ग पर जाने की सिफारिश नहीं करता। –

+0

बहुत देर हो चुकी है, मैं वर्तमान में 'make_resourceful' का उपयोग कर रहा हूं लेकिन उपयोगकर्ता को 'create' के बाद सही स्थान पर रीडायरेक्ट करने में असमर्थ हूं, यह हमेशा' show' पर जाता है क्योंकि यह 'respond_for (: create) do | format |' में प्रवेश नहीं कर रहा है और बाहर चला जाता है। कोई नमूना नियंत्रक कोड? @AaronGray – LearningROR

3

मैं अपने प्रतिक्रिया संदेश उत्पन्न करने के लिए Rails responders के संयोजन का उपयोग करता हूं और कुछ conten मेरी <action>.js फ़ाइल में टी।

की सामग्री - कहते हैं update.js कुछ इस तरह दिखेगा:

// Checks if the article slug has changed. 
// If it has the entire page should be reloaded at that new location. 
<%= reload_if_slug_changed @article, params[:id] %> 

// Displays the flash notices 
// See ApplicationHelper#js_flash_response 
<%= js_flash_response %> 

कहाँ विभिन्न तरीकों (मेरे मामले में मेरे ApplicationHelper में) कुछ सहायक में परिभाषित कर रहे हैं।

def js_flash_response 
    if flash.now[:notice].present? 
    js = "$('#notice').html('#{flash.now[:notice]}').change();" 
    elsif flash.now[:alert].present? 
    js = "$('#alert').html('#{flash.now[:alert]}').change();" 
    end 
end 

def reload_if_slug_changed object, expected_value 
    "window.location.href = '#{url_for [:edit, object]}';" if object.slug != expected_value 
end 

फ़्लैश संदेशों की सामग्री Rails responders द्वारा स्वचालित रूप से उत्पन्न और now गुंजाइश है कि फ्लैश हैश से हटा देता है के साथ प्रदर्शित किया, यह सुनिश्चित कर रहे हैं कि अगर उपयोगकर्ता पुनः लोड (के बाद: अलग अलग तरीकों की सामग्री के इस प्रकार हैं फ्लैश प्रदर्शित किया गया है) वे फिर से नहीं दिखाई देंगे।

मुझे विश्वास नहीं है कि आपको किसी भी दूरस्थ create पर एक रिमोट एक्शन की ओर इशारा करते हुए एक फॉर्म बनाना चाहिए, क्योंकि आप हमेशा महत्वपूर्ण रीडायरेक्ट की अपेक्षा करेंगे, इसलिए मेरे मामले में मुझे केवल यूआरएल स्लॉग बदलने पर रीडायरेक्ट करने की आवश्यकता है।

मुझे उम्मीद है कि इससे मदद मिलती है। यह कोई समाधान नहीं है, लेकिन जिस तरह से मैंने कुछ समस्याओं को संभाला है।

सर्वश्रेष्ठ संबंध।

3

अपने परिदृश्य के तहत, यहां मैं नियंत्रक कार्रवाई से पृष्ठ में जावास्क्रिप्ट इंजेक्ट कैसे करूंगा। आप इस तरह से अपनी कार्रवाई डालने कुछ का तर्क खंड पूरा करने के बाद:

render :update do |page| 
    page << "javascript_here" 
end 

यह आपको आप विंडो स्थान डालने या एक जावास्क्रिप्ट फ्लैश विधि बना सकते हैं और जब आपके बनाने के विधि सही ढंग से कार्यान्वित यह कॉल करने की अनुमति चाहिए।

यदि आप अपने नियंत्रक कार्यों को DRY करना चाहते हैं, तो मैं this Railscast about make_resourceful पर देखने की अनुशंसा करता हूं। Make_resourceful स्वचालित रूप से प्रत्येक क्रिया के लिए प्रत्येक कोर गतिविधि निष्पादित करता है।यह आपको before :create, after :create, response_for :create, और after :create_fails जैसे हुक में टैप करने की अनुमति देता है। इस मणि का उपयोग करके, आप अपनी विधियों की सफलता या विफलता के आधार पर कोड चला सकते हैं और उन पर बेहतर अनाज नियंत्रित कर सकते हैं।

इसके अलावा, आप अपनी व्यू फ़ाइल में create.js.erb और create_fails.js.erb को प्रारंभ करने में सक्षम होना चाहिए, अपने नियंत्रक में कुछ भी पास किए बिना format.js शामिल करें, और रेल स्वचालित रूप से उस फ़ाइल को चलाएं जिसमें जावास्क्रिप्ट शामिल है, इस पर निर्भर करता है कि नियंत्रक कार्रवाई सफलतापूर्वक निष्पादित की गई है या नहीं।

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