2017-08-10 22 views
8

Tôi đang cố di chuyển ứng dụng Rails 4.2 sang Rails 5.1. Trong đường ray 4.2, chúng tôi đã sử dụng rất nhiều JQuery. Hiện tại tôi đang cố gắng tạo các biểu mẫu, với thuộc tính remote: true hoạt động đúng. Như một ví dụ này là một hình thức đơn giản mà người dùng chọn quốc giađường ray 5, từ xa: biểu mẫu dữ liệu rỗng thực sự

= simple_form_for(:user_data, 
    url: user_path(@user), 
    remote: true, 
    method: :patch, 
    data: {'user-update' => true}, 
    dataType: 'json', 
    html: wrapper: :horizontal_form) do |f| 
    .panel.panel-default 
    .panel-body 
     .col-md-8 
     = f.input :country, label: 'Country', 
     = f.button :submit 

Bộ điều khiển

def update 
    @user.update!(user_params) 
    render json: @user 
end 

Tôi đã cố gắng thêm các định dạng phản ứng respond_to với js, nhưng trong trường hợp đó nó cố gắng để chuyển đổi @user để thực thi javascript. Tính đến xử lý sự kiện trông như thế này

$('form[data-user-update]') 
    .on('ajax:success', function(e, data, status, xhr) { 
    // The data variable is empty 
    }) 
    .on('ajax:error', function(e, error, status, xhr) { 
    $('.simple_form').renderFormErrors('user_data', error.responseJSON); 
    }); 

EDIT

đáp ứng Tiêu đề

HTTP/1.1 200 OK 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
X-Content-Type-Options: nosniff 
Content-Type: application/json; charset=utf-8 
ETag: W/"f53889092c58dc37054386c9504ad1ff" 
Cache-Control: max-age=0, private, must-revalidate 
X-Request-Id: 712b59ff-8011-4b10-a905-83e559b47452 
X-Runtime: 0.101165 
Transfer-Encoding: chunked 

Tiêu đề yêu cầu

Accept:text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8,et;q=0.6 
Connection:keep-alive 
Content-Length:71 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
Host:localhost:3000 
Origin:http://localhost:3000 
Referer:http://localhost:3000/users/470d573b-b0f1-4822-b036-7d37be6672d6 
X-Requested-With:XMLHttpRequest 

đáp ứng

{ 
    firstName:'John', 
    lastName: 'Smith', 
    country: 'USA' 
} 
+0

bạn có thể kiểm tra thông qua các công cụ phát triển đáp ứng của máy chủ? (trong Chrome, tab "mạng", thực hiện gửi biểu mẫu từ xa, tìm yêu cầu và phân tích lại HTTP/resq) – MrYoshiji

+0

@MrYoshiji, vui lòng xem bản cập nhật –

+0

nếu bạn đặt một trình gỡ lỗi 'trong lời gọi lại« ajax: success', bạn có thể thấy bất kỳ giá trị nào cho 'e',' dữ liệu', v.v ... không? – MrYoshiji

Trả lời

7

Chỉ cần tìm ra khi chạy vào cùng một vấn đề.

Theo http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#dealing-with-ajax-events

Tôi giả sử bạn đang sử dụng đường ray-ujs thay vì jquery-ujs cũ. Trong jquery-ujs mã sẽ làm việc và dữ liệu, trạng thái, xhr sẽ được trả về; ray-ujs tuy nhiên chỉ trả về một thuộc tính - sự kiện và những thứ bổ sung được truy cập thông qua mảng trên event.details

Theo ví dụ trong hướng dẫn sử

document.body.addEventListener('ajax:success', function(event) { 
    var detail = event.detail; 
    var data = detail[0], status = detail[1], xhr = detail[2]; 
}) 

Bạn có thể truy cập vào phản ứng bằng cách gọi event.detail [0]

Nếu bạn đã có khá nhiều mã dựa vào chức năng này, có thể là một cược tốt hơn là thay đổi đường ray-ujs trở lại jquery-ujs

+0

Cảm ơn, đã giải quyết được vấn đề :) –

+1

Có gì bực bội là tài liệu chính thức cũng đã lỗi thời. – dimroc

Các vấn đề liên quan