ajax 방식으로 레일 3에 양식 제출 (jQuery 사용)


79

저는 rails와 jQuery의 초보자입니다. 한 페이지에 두 개의 별도 양식이 있으며 jQuery를 사용하여 ajax 방식으로 별도로 제출하고 싶습니다. 이것이 내가 얼마나 멀리 왔는지입니다. 누구나이 코드를 추가하거나 수정할 수 있습니다. Rails 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%>

SchoolController

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

CourseController는 SchoolController와 같은 모양입니다.

답변:


108

당신이 원하는 :

  1. 제출의 정상적인 동작을 중지하십시오.
  2. ajax를 통해 서버로 보냅니다.
  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을 사용하고 Rails에서 메서드를 생성하는 리소스에 게시하려고했기 때문에 요청이 POST가되어야한다고 생각합니다. 에서 리소스로 선언 된 항목에 대한 양식 요청을 제출 routes.rb하려면 GET이 아닌 POST를 사용하고 있는지 확인해야합니다. jQuery를 사용하여 간단하게 추가 할 type: 'POST'받는 $.ajax전화.
Eli Hooten 2012

이 코드를 구현했지만 실제로 제출하지 않는 것 같습니다. 나는 $(CODE).submit();그것을 실행하기 위해 호출 로 포장해야하고 2 개의 게시물을 제출합니다. 어떤 아이디어?
thinkpunch

양식이 상당히 큰 경우 어떻게해야합니까? .serialize ()는 제출시 너무 긴 요청 URI 오류를 발생시킵니다.
zykadelic 2013 년

첫 번째 설명을 참조하십시오. POST 요청을 수행해야합니다. 따라서 type: 'POST'ajax-call에 추가 하십시오.
Johan

1
이 대답은 실제로 레일 방식이 아닙니다.
Mild Fuzz

58

:remote => true양식에 사용 하는 경우 JavaScript로 제출할 수 있습니다.

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

4
나는 오늘 내 코드의 버그에 물려 나와 같은 상황에 처한 다른 사람들을 돕기 위해 게시했습니다. 숨겨진 필드가 있었고 실수로 (복사 및 붙여 넣기 오류) 필드가 "필수"로 표시되었습니다. 필드에 할당 된 값이 없습니다 (내가 정적으로 할당 했어야 함). 숨겨져 있기 때문에 레일이 수정하기 위해 가리키는 UI 아티팩트가 없습니다. 오히려 양식이 제출 될 때 rails는 구독하지 않으면 도대체 무슨 일이 일어나고 있고 왜 양식이 제출되지 않았는지 알 수없는 이벤트를 조용히 시작합니다.
앉아

1
AJAX를 통해 자동으로 양식을 제출하는 것은 개발 과정에서 항상이 문제가 있습니다. 개발 도구에서 트랜잭션이 발생하는 것을 볼 수 있어야합니다. 또한 양식이 올바르게 제출 된 후에 만 ​​AJAX를 적용해야합니다.
Mild Fuzz 2013 년

난을 흥미은 몰랐어
알랭 골드만

이것은 UJS의 최고의 답변입니다. 양식 제출시 원격 서비스에서 Stripe 토큰을 비동기 적으로 가져 오는 양식이 있다고 가정 해 보겠습니다. Stripe 콜백 함수에서 Stripe 응답을 받으면 이제 양식을 Rails create action에 다시 제출해야합니다. 사용 .ajax하면 'create.js.erb'템플릿에서 성공 및 오류 데이터를 처리 할 수 ​​없습니다. .submit()두 번째 사용을 시도하면 remote => true및 인증 토큰이 손실됩니다. .trigger바위, 양식은 'create.js.erb'렌더링, 그것이 정상적으로 # 만들기 위해 할 것
user3670743을

@ user3670743-감사합니다. 이 점에 대해 자세히 설명 할 수 있습니까?
BKSpurgeon

33

Rails 3에서 ajax 양식 제출을 수행하는 가장 좋은 방법은 Rails-ujs를 활용하는 것입니다.

기본적으로 Rails-ujs가 ajax 제출을 수행하도록 허용합니다 (그리고 js 코드를 작성할 필요가 없습니다). 그런 다음 js 코드를 작성하여 응답 이벤트 (또는 기타 이벤트)를 캡처하고 작업을 수행합니다.

다음은 몇 가지 코드입니다.

먼저 form_for 에서 원격 옵션을 사용하여 양식이 기본적으로 ajax를 통해 제출되도록합니다.

form_for :users, remote:true do |f|

그런 다음 ajax 응답 상태 (예 : 성공한 응답)에 따라 몇 가지 작업을 수행하려면 다음과 같이 javscript 논리를 작성합니다.

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

가 있습니다 여러 이벤트 당신이 연결할 수 있습니다.


1
Rails 4와 동일하며 기본 프로젝트 템플릿에 설치됩니다. 그리고 api.jquery.com/jquery.ajax에data: {type: 'text'} 설명 된대로 속성 을 설정하는 것을 잊지 마십시오. JSON 구문 분석 오류로 인해 요청이 실패 할 수 있습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

13

AJAX를 통해 양식을 제출하려면 도우미 :remote => true에게 전달 하면 form_for됩니다. 기본적으로 rails 3.0.x는 프로토 타입 js lib를 사용하지만 jquery-railsgem 을 사용하여 jquery로 변경할 수 있습니다 (rails 3.1의 기본값). bundle install그런 다음 rails g jquery:install프로토 타입 파일을 jquery로 바꿉니다.

그 후에는 콜백을 처리하기 만하면됩니다. 보세요 스크린 캐스트를


이미 내 디렉토리에 jquery 라이브러리가 있고 프로토 타입 파일을 제거했습니다. jquery가 작동하지만 거기에서 양식 양식을 제출해야합니다
katie

더 이상 설치 프로그램이 필요하지 않습니다 : stackoverflow.com/questions/7103437/…
Alex Moore-Niemi

2

ajax를 사용하여 요청에서 매우 중요합니다. 동작 기본값을 중지하고 form_for에서 remote : true를 보냅니다.

<%= 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 모달 라이브러리가 모달 창을 불러 오면 원격 데이터를 통해 내 양식을 제출하지 못하게하는 것이었지만 수정 사항을 찾았습니다.

먼저 자산 javascript 디렉토리에 jQuery Form Plugin을 추가하십시오. 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);
        }
      })
    })

  })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.