Rails中使用ajax的两种方法及调试技巧

Rails这个超级强大的网站构建器为用户界面变更和交互提供了ajax操作的能力,据我所知在Rails中使用ajax有两种方法,下面为大家一一道来 ;)

一.在$(document).ready中注册hook,伺机而动

我们可以为html中某个元素注册回调钩子,比如在select中的选项发生改变的时候:

<%= select_tag("department",options_from_collection_for_select(@departments, "id", "name"),include_blank:false,:'data-remote'=>'true',:'data-url'=>url_for(controller:'static_pages',action:'dep_changed'),:'data-type'=>'json') %>

上面代码中首先开启了data-remote确保触发远程调用,注意最后一个data-type的类型为json,这决定了控制器中的响应类型:

def dep_changed
        log(params)
        dep = Department.find(params[:department])
        render :json=>dep.offices.map {|office| [office.id,office.name]}
    end

最后需要为#department注册hook:

$(document).ready(function() {

  // #first_select is the id of our first select box, if the ajax request has been successful,
  // an ajax:success event is triggered.

  $('#department').on('ajax:success',null, function(evt, data, status, xhr) {
    //do some staff...
    });
  });
});

那么我们在这种情况下如何调试呢?以MacOS的Safari为例,打开对应html页面,选择开发菜单->资源->脚本->application.js:

这里写图片描述

你可以在其中任意下断点,很方便不是吗!?

二.以Javascript方式响应

第二种方式不用注册回调,不用修改全局的application.js文件,你只需要为特定的动作创建js.erb脚本即可,首先将select中的data-type项删掉,这样默认是以js方式响应.

修改对应Action:

def dep_changed
        log(params)
        dep = Department.find(params[:department])
        @offices = dep.offices
        respond_to do |format|
            format.js
        end
    end

创建与action同名的js.erb文件dep_changed.js.erb:

(function() {
    var office_select = $('#office');
    office_select.empty();

    var opt = null;

    <% @offices.each do |office| %>
        opt = $('<option/>');
        opt.attr('value', <%=office.id%>);
        opt.text('<%=office.name%>');
        opt.appendTo(office_select);
    <% end %>

}).call(this);

不过这种方法无法下断点调试,但是你可以看到执行后的代码,还是以Safari为例,在打开了开发界面后,选择资源->XHR:

这里写图片描述

在每次触发JavaScript脚本时,都会生成新的响应js代码,如上图所示.

值得注意的是以第二种ajax方式操作时,即使删除了html元素的data-type项,但如果你在application.js中为该元素设定了hook,则任然会触发,只不过此时会出现错误,提示data对象非法,因为你没有接收到json数据.如果你一定要同时使用两种方法,那么你必须预先判断data是否有效.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值