2017-08-10 48 views
8

我正在尝试将Rails 4.2应用程序迁移到Rails 5.1。在rails 4.2中,我们大量使用JQuery。目前我正在努力制作表格,并且remote: true属性正常工作。作为一个例子,这是一个简单的形式,其中用户选择国家rails 5,remote:true form empty data

= 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 

控制器

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

我试图添加respond_tojs响应格式,但在这种情况下,它试图转换@user可执行的JavaScript。由于事件处理程序看起来像这样

$('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); 
    }); 

编辑

响应头

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 

请求头

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 

响应

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

您可以通过开发工具服务器的响应检查? (在Chrome中,选项卡“网络”,执行表单远程提交,查找请求并分析HTTP请求/分辨率) – MrYoshiji

+0

@MrYoshiji如果您在'ajax:success'回调中添加'debugger',请参阅更新 –

+0

,你能看到'e','data'等的任何值吗? – MrYoshiji

回答

7

刚算出来,同时遇到同样的问题。

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

我假设你正在使用的,而不是旧的jQuery的UJS轨-UJS。在jquery-ujs中,代码将工作并返回数据,状态xhr;导轨-UJS然而仅返回一个属性 - 事件和额外的事情是通过阵列上event.details

按照实施例在引导

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

可以通过调用event.detail接入响应访问[0]

如果你已经有了相当多的代码依靠这个功能,可能是一个更好的办法是改变轨道,UJS回到jQuery的UJS

+0

谢谢,这解决了问题:) –

+1

令人沮丧的是,官方文件也过时了。 – dimroc