फार्म 3 रेलगाड़ियों में फार्म जमा करें (jQuery के साथ)


79

मैं रेल और jQuery में एक शुरुआत कर रहा हूँ। मेरे पास एक पृष्ठ में दो अलग-अलग फॉर्म हैं और मैं उन्हें अलग तरीके से अजाक्स तरीके (jQuery के साथ) में जमा करना चाहता हूं। यह मुझे कितनी दूर है। क्या कोई इसे काम करने के लिए इस कोड को जोड़ या ठीक कर सकता है। मैं रेल 3.1 और jQuery 1.6 का उपयोग कर रहा हूं। पहले ही, आपका बहुत धन्यवाद।

application.js

$(".savebutton").click(function() { 
    $('form').submit(function() {
         $(this).serialize();
    });
}); 

पहला रूप:

<%=form_for :users do |f| %>
  <fieldset>
    <legend>Basic details</legend>
    <%= f.label :school %>
    <%= f.text_field :school,:size=>"45",:class=>"round",:id=>"school" %><br/>      
  </fieldset>
  <p><%= button_to "save and continue",{:class=>"savebutton"} %></p>
<%end%>

दूसरा रूप:

<%=form_for :courses do |c| %>
  <fieldset>
    <legend>Your current classes</legend>
    <label>class:</label><%= c.text_field :subject,:size=>"45",:class=>"round" %><br/>
  </fieldset>
  <p><%= button_to "save and continue",{:class=>"savebutton"} %></p>
<%end%>

स्कूलकंट्रोलर

class SchoolController < ApplicationController
  respond_to :json
  def create
    @school = current_user.posts.build(params[:school].merge(:user => current_user))
    if @school.save
      respond_with @school
    else
      respond_with @school.errors, :status => :unprocessable_entity
    end
  end
end

कोर्सकंट्रोलर स्कूलकंट्रोलर के समान आकार में है

जवाबों:


108

आप चाहते हैं कि:

  1. जमा के सामान्य व्यवहार को रोकें।
  2. इसे अजाक्स के माध्यम से सर्वर पर भेजें।
  3. एक उत्तर प्राप्त करें और उसके अनुसार चीजों को बदलें।

नीचे दिए गए कोड को ऐसा करना चाहिए:

$('form').submit(function() {  
    var valuesToSubmit = $(this).serialize();
    $.ajax({
        type: "POST",
        url: $(this).attr('action'), //sumbits it to the given url of the form
        data: valuesToSubmit,
        dataType: "JSON" // you want a difference between normal and ajax-calls, and json is standard
    }).success(function(json){
        console.log("success", json);
    });
    return false; // prevents normal behaviour
});

14
यह मेरे लिए उपरोक्त रूप में काम नहीं आया। मेरा मानना ​​है कि ऐसा इसलिए था क्योंकि मैं एक संसाधन पर पोस्ट करने का प्रयास कर रहा था, जो सूचकांक के लिए एक ही URL का उपयोग करता है और रेल में तरीके बनाता है, इसके लिए अनुरोध को POST होने के लिए मजबूर करना पड़ता है। यदि आप किसी ऐसी चीज़ के लिए फ़ॉर्म अनुरोध प्रस्तुत करना चाहते हैं जिसे संसाधन घोषित किया गया है routes.rb, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप POST का उपयोग कर रहे हैं और GET का नहीं। JQuery का उपयोग करना, बस जोड़ने type: 'POST'के लिए $.ajaxकॉल।
एली हूटेन

मैंने यह कोड लागू कर दिया है, लेकिन यह वास्तव में सबमिट नहीं होता है। मुझे $(CODE).submit();इसे निष्पादित करने के लिए कॉल में लपेटना है , फिर यह 2 पदों को सबमिट करता है। कोई विचार?
विचार

यदि मेरे पास एक बड़ा रूप है तो मैं यह कैसे करूँ? .serialize () सबमिट करने पर URI बहुत लंबी त्रुटि का अनुरोध करेगा।
ज़िकादेलिक

पहले टिप्पणी देखें, फिर आपको एक पोस्ट-अनुरोध करने की आवश्यकता है। तो type: 'POST'अजाक्स-कॉल में जोड़ें ।
जोहान

1
यह जवाब वास्तव में रेल रास्ता नहीं है।
माइल्ड फज

58

यदि आप :remote => trueअपने प्रपत्रों पर उपयोग करते हैं, तो आप उन्हें जावास्क्रिप्ट के साथ सबमिट कर सकते हैं

$('form#myForm').trigger('submit.rails');

4
मुझे आज मेरे कोड में एक बग ने काट लिया है ताकि दूसरों की मदद करने के लिए पोस्टिंग जो मेरी जैसी स्थिति में समाप्त हो। मेरे पास एक छिपा हुआ क्षेत्र था और गलती से (कॉपी और पेस्ट त्रुटि), फ़ील्ड को "आवश्यक" के रूप में चिह्नित किया गया था। फ़ील्ड में कोई मान असाइन नहीं किया गया है (मेरे द्वारा सांख्यिकीय रूप से असाइन किया गया होना चाहिए)। इसके छिपे होने के बाद, कोई यूआई विरूपण साक्ष्य नहीं है जो रेल आपको ठीक करने के लिए इंगित करेगा। इसके बजाय, जब फॉर्म जमा किया जाता है, तो रेल चुपचाप एक घटना को आग लगा देगा कि अगर आप सदस्यता नहीं लेते हैं, तो आपको पता नहीं चलेगा कि नरक क्या चल रहा है और क्यों फॉर्म कभी जमा नहीं हुआ।
बैठा

1
AJAX के माध्यम से चुपचाप एक फॉर्म सबमिट करना हमेशा विकास में यह समस्या है। आपको अपने देव उपकरणों में लेनदेन को देखने में सक्षम होना चाहिए। इसके अलावा, आपको अपने फॉर्म को सही ढंग से सबमिट करने के बाद केवल AJAX लागू करना चाहिए।
माइल्ड फज

दिलचस्प मुझे नहीं पता था कि
एलन गोल्डमैन

यूजेएस के साथ यह सबसे अच्छा जवाब है। मान लें कि आपके पास एक फ़ॉर्म है जो अतुल्यकालिक रूप से फॉर्म सबमिट पर एक दूरस्थ सेवा से स्ट्राइप टोकन प्राप्त कर रहा है। आपके स्ट्राइप कॉलबैक फ़ंक्शन में आपको स्ट्राइप रिस्पॉन्स मिलता है और अब आपको अपना फॉर्म दोबारा से रेल्स एक्शन के लिए सबमिट करना होगा। यदि आप इसका उपयोग .ajaxकरते हैं तो आप अपने 'create.js.erb' टेम्प्लेट में सफलता और त्रुटि डेटा को संभालने में सक्षम नहीं होने चाहिए। .submit()दूसरी बार उपयोग करने का प्रयास करें , और आपका remote => trueऔर ऑर्टिकल टोकन खो जाता है। .triggerचट्टानें, आपका फॉर्म # क्रिएट करने के लिए इसे बना देगा, जैसा कि 'create.js.erb' को प्रस्तुत करना है
user3670743

@ user3670743 - धन्यवाद। क्या आप इस बिंदु पर विस्तार करने में सक्षम हैं?
BKSpurgeon

33

रेल 3 फार्म में पसंदीदा तरीका है अजाक्स फार्म जमा करने के लिए रेल-उज् का उपयोग करना है।

मूल रूप से आप रेल्स- ujs को आपके लिए ajax सबमिट करने की अनुमति देते हैं (और आपको कोई js कोड लिखने की आवश्यकता नहीं होगी)। फिर आप बस प्रतिक्रिया घटना (या अन्य घटनाओं) को पकड़ने के लिए js कोड लिखते हैं और अपनी बात करते हैं।

यहाँ कुछ कोड हैं:

सबसे पहले, form_for में दूरस्थ विकल्प का उपयोग करें ताकि फ़ॉर्म डिफ़ॉल्ट रूप से अजाक्स के माध्यम से प्रस्तुत होगा:

form_for :users, remote:true do |f|

फिर जब आप अजाक्स प्रतिक्रिया स्थिति (जैसे सफल प्रतिक्रिया) के आधार पर कुछ कार्रवाई करना चाहते हैं, तो इस तरह से जावास्क्रिप्ट तर्क लिखें:

$('#your_form').on('ajax:success', function(event, data, status, xhr) {
  // Do your thing, data will be the response
});

ऐसी कई घटनाएं हैं, जिन पर आप हुक लगा सकते हैं।


1
रेल 4 पर समान, जहां यह डिफ़ॉल्ट प्रोजेक्ट टेम्पलेट पर स्थापित होता है। और api.jquery.com/jquery.ajaxdata: {type: 'text'} पर दस्तावेज के रूप में विशेषता सेट करना न भूलें या JSON पार्स त्रुटि के कारण अनुरोध विफल हो सकता है।
सिरो सेंटिल्ली 郝海东 冠状 iro i

13

AJAX के माध्यम से फॉर्म जमा करने के लिए आप बस सहायक :remote => trueको पास कर सकते हैं form_for। डिफ़ॉल्ट रेल द्वारा 3.0.x प्रोटोटाइप js lib का उपयोग करता है, लेकिन आप इसे jquery-railsमणि के साथ jquery में बदल सकते हैं (जो कि रेल 3.1 के लिए डिफ़ॉल्ट है)। bundle installयह और फिरrails g jquery:install jquery के साथ प्रोटोटाइप फ़ाइलों को बदलने के लिए।

इसके बाद आपको कॉलबैक को हैंडल करना होगा। इस पेंचकस पर एक नजर


पहले से ही मेरी निर्देशिका में jquery लाइब्रेरी है और मैंने प्रोटोटाइप फ़ाइलों को हटा दिया है, jquery काम करता है लेकिन मुझे वहाँ से फॉर्म फॉर्म जमा करने की आवश्यकता है
katie

इंस्टॉलर आवश्यक नहीं है: stackoverflow.com/questions/7103437/…
एलेक्स मूर-नीमी

2

यह आपके अनुरोध में बहुत महत्वपूर्ण है अजाक्स के साथ बीहाइवर डिफ़ॉल्ट को रोकें, दूरस्थ भेजें: अपने form_for में सही

<%= form_for :session, url: sessions_path, remote: true, html: { class: "form-signin" } do |f| %>

<% end %>

आपके अजाक्स में

$(".form-signin").on("submit", function(e) {
    $.ajax({
        url: $(this).attr('action'),
        data: $(this).serialize(),
        type: "POST",
        dataType: "json",
        success: function(response) {
            console.log(response)
        },
        error: function(xhr, textStatus, errorThrown) {}
    });
    e.preventDefault(); //THIS IS VERY IMPORTANT
});

0

यहां मेरे लिए कुछ भी काम नहीं किया, मेरा मुद्दा था कि jQuery मोडल लाइब्रेरी रिमोट डेटा के माध्यम से सबमिट किए जाने से मेरे रूपों को तोड़ देगा अगर मैं एक मोडल विंडो लाया, लेकिन मुझे एक ठीक मिला।

सबसे पहले अपनी संपत्ति जावास्क्रिप्ट निर्देशिका में jQuery के फार्म प्लगइन जोड़ें: http://malsup.github.io/jquery.form.js

अब आपके फॉर्म के लिए सबमिट विधि को ओवरराइड करें। उदाहरण के लिए आप कुछ ऐसा कर सकते हैं:

= form_for @object, html: {class: "ajax_form_submit"}, authorization_token: true do |f|
  = f.text_input

javascript:

  $(document).on('ready page:load', function() {

    $(".ajax_form_submit").submit(function () {
      var form = $(this)
      form.ajaxSubmit({
        success: function (responseText, statusText, xhr) {
          console.log('success: ajax_form_submit')
        },
        error: function (jqXHR, statusText, errorThrown) {
          console.log('error: ajax_form_submit');
          console.log(jqXHR, statusText, errorThrown);
        }
      })
    })

  })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.