从Angular服务调用Rails函数

时间:2015-11-11 09:41:22

标签: ruby-on-rails angularjs

如果像这样定义一个简单的Rails控制器:

class ProductsController < ApplicationController

  respond_to :json

  def index
  end

  def new
  end

  def create
    @product = Product.new(product_params)
    @product.save
    redirect_to @product

    # this can be used if there is no view already created 
    # render plain: params[:products].inspect
  end

  def show
    @product = Product.find(params[:id])
    respond_with @product
  end

  def show_all
    # @products = Product.all
    # respond_with @products
    respond_to do |format|
      @products = Product.all

      format.html 
      format.json { render json: @products }
    end
  end

  private
      def product_params
        params.require(:product).permit(:name, :description)
      end
end

我试图通过执行以下操作在我的Angular服务中使用它:

function HomeService($resource) {
    function exposeTest() {
        /*
        {
            'create':  { method: 'POST' },
            'index':   { method: 'GET', isArray: true },
            'show':    { method: 'GET', isArray: false },
            'update':  { method: 'PUT' },
            'destroy': { method: 'DELETE' }
        }
        */
        return $resource('/products/show_all', {}, {
            'show_all':     { method: 'GET', isArray: false }
        });
    }
    return {
        exposeTest: exposeTest
    };
}

我在home.controller.js中这样称呼它:

console.log('Expose Test: '+JSON.stringify(HomeService.exposeTest().show_all()));

我的理解是你可以定义一个$ resource对象来与控制器交互 - 也就是说我已经定义了一个可以用show_all调用的GET类型方法,但我得到的只是一个空对象。

我做错了什么?

由于

1 个答案:

答案 0 :(得分:2)

因此问题的本质是我在经过多次挖掘和调整后设法解决的问题。下面我将发布两种获取相同数据的方法 - 一种是基本的$ http,另一种是超过$资源。首先是服务电话:

    HomeService.httpShowAll().then(function(data) {
        vm.httpProducts = data;
    });
    HomeService.resourceShowAll().index().$promise.then(function(success) {
        vm.resourceProducts = success;
    });

在服务本身:

    function httpShowAll() {
        return $http.get('/products/index.json',{}).success(function(data) {});
    }
    function resourceShowAll() {
        return $resource('/products/index.json', {} , {
            index: {isArray: true}
        });
    }

resourceShowAll()函数中的上述索引部分充当控制器调用资源对象的键。最后是Rails控制器索引函数:

  respond_to :json
  def index
    @products = Product.all
    respond_to do |format|
      format.json { render json: @products }
      format.html 
    end
  end

我希望这可以帮助任何来自纯角色背景的人使用Angular和Rails。

注意:我会在完成后立即使用基本的CRUD功能更新此答案:

  • 创建
  • 阅读(上文)
  • 更新
  • DELETE