使用Extjs Ajax代理和rails rest服务器

时间:2012-11-23 17:21:16

标签: extjs extjs4

我正在尝试通过GET方法调用我的服务器操作/用户/菜单,但它只能与REST代理一起使用。

这是我的商店声明:

Ext.define('App.store.Menu', {
extend: 'Ext.data.Store',   
model: 'App.model.Menu',
proxy: {
    type: 'ajax',
    reader: {
        type: 'json'        
    },
    api: {
        read: 'users/menus'
    }
}
});

以下是我加载商店的方式:

var store = Ext.create('App.store.Menu').load({
    id: 1,
    callback: function () {
        //do something...
    }
});

这是我的rails代码:

def menus
  @user = User.find(params[:id])  
  @menus = @user.menus
  respond_to do |format|
    format.html # menus.html.erb
    format.json { render json: @menus }
  end
end

我在服务器上收到此错误:

ActiveRecord::RecordNotFound (Couldn't find User with id=menus):
  app/controllers/users_controller.rb:16:in `show'

但如果我使用REST代理,我会收到正确的请求:

Ext.define('App.store.Menu', {
    extend: 'Ext.data.Store',   
    model: 'App.model.Menu',
    proxy: {
      type: 'rest',
      format: 'json',
      url: 'users/menus'
    }
});  

1 个答案:

答案 0 :(得分:0)

这是因为您的url架构是REST架构,然后您应该使用rest代理。这是两个代理发送Id值的方式:

Ajax代理:yourdomain.com/users/menus?id=1

休息代理:yourdomain.com/users/menus/1

当您的应用程序理解休息模式时,没有理由使用和ajax代理。但是,如果您想强制使用ajax请求,可以按如下方式修改代理:

Ext.define('App.store.Menu', {
    extend: 'Ext.data.Store',   
    model: 'App.model.Menu',
    proxy: {
        type: 'ajax',
        url: 'users/menus',
        reader: {
            type: 'json'        
        },
        buildUrl: function(request) {
            debugger;
            var me = this,
                url = me.getUrl(request),
                operation = request.operation,
                id  = operation.id;

            if (id) {
                if (!url.match(/\/$/)) {
                    url += '/';
                }

                url += id;
            }  
            return url;            
        }
    }    
});

这与rest代理类似,但它是一个ajax代理。

祝你好运!