Отправлять данные о продукте JSON из контроллера Angular в Rails LineItem

0

У меня есть калькулятор (для подсчета количества отсчетов продукта и дополнительных позиций), написанного на AngularJS, я использую драгоценные камни "угловые рельсы-ресурсы".

Я хочу передать данные из калькулятора в контроллер LineItem (для тележки) в рельсах.

    productCenter.factory('LineItem', ['railsResourceFactory', function       (railsResourceFactory) {
    return railsResourceFactory({
        url: '/line_items',
        name: 'line_item'
       });
     }]);


    LineItem.query().then(function (results) {
        $scope.line_items = results;
    });


    $scope.addLineItem = function() {
     new LineItem ({
        product_id: $scope.selectedProduct.id,
      # whole_count: $scope.wholeCount,
     }).create()
    }

В рельсах у меня есть "создать" метод из Agile Web book:

def create
  product = Product.find(params[:product_id])
  @line_item = @cart.add_product(product.id)
end

В маршрутах рельсов:

post "line_items/:product_id" => "line_items#create"

И когда я нажимаю кнопку "Добавить в корзину", на консоли у меня есть ошибка:

Started POST "/line_items" for ::1 at 2015-12-05 02:45:35 +0300
Processing by LineItemsController#create as JSON
  Parameters: {"line_item"=>{"product_id"=>2}, :product_id=>{}}
  Cart Load (0.0ms)  SELECT  "carts".* FROM "carts" WHERE "carts"."id" = ? LIMIT 1  [["id", 27]]
  Product Load (0.0ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1  [["id", nil]]
Completed 404 Not Found in 8ms (ActiveRecord: 0.0ms)

ActiveRecord::RecordNotFound (Couldn't find Product with 'id'={}):
  app/controllers/line_items_controller.rb:41:in 'create'

Если я изменил параметры поиска в методе "create" в контроллере LineItem следующим образом:

def create
    product = Product.find(product_params)
    @line_item = @cart.add_product(product.id)
 private
   def product_params
      params.require(:line_item).permit(:product_id)
   end
end

В консоли у меня есть следующая ошибка:

Started POST "/line_items" for ::1 at 2015-12-05 02:46:22 +0300
Processing by LineItemsController#create as JSON
  Parameters: {"line_item"=>{"product_id"=>2}, :product_id=>{}}
  Cart Load (0.0ms)  SELECT  "carts".* FROM "carts" WHERE "carts"."id" = ? LIMIT 1  [["id", 27]]
  Product Load (0.0ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1  [["id", nil]]
Completed 404 Not Found in 26ms (ActiveRecord: 1.0ms)

ActiveRecord::RecordNotFound (Couldn't find Product with 'id'={"product_id"=>2}):
  app/controllers/line_items_controller.rb:41:in 'create'

Короче говоря, мне нужно передать много расчетных данных в угловом виде: count, consumables_count, instruments_count. И именно поэтому я использую угловые и json. Но:

  1. Я не могу найти продукт по id в rails Контроллер LineItem (продукт = Product.find(product_params) - ОШИБКА)

  2. И я не знаю, как передать расчетную информацию контроллеру рельсов и как справиться с этим, чтобы я мог просматривать эту рассчитанную информацию в корзине? (например, @cart.line_items.whole_count)

Теги:
ruby-on-rails-4
ruby-on-rails-3

2 ответа

0
Лучший ответ

Когда вы это сделаете:

product = Product.find(product_params)

Вы передаете {"product_id" => 2} качестве параметра для find. Это неверно, вместо этого вы должны сделать следующее:

product = Product.find(product_params[:product_id])

find принимает только идентификатор записи в БД.

0

Наконец, я кодирую так:

def create
    product = Product.find(product_params[:product_id])
    product_attr = product_attr_params
    @line_item = @cart.add_product(product.id, product_attr)
   end 

private
 def product_attr_params
      params.require(:line_item).permit(:whole_count, :trim_count, :tools_count, :consumables_count, :fill_count, :finish_count, :install_count)
    end 

    def product_params
        params.require(:line_item).permit(:product_id)
    end
end

Product_params и product_attr_params => должны быть объединены

Мой POST от AngularJS

      new LineItem ({
            product_id: $scope.selectedProduct.id,
            whole_count: whole_count,
            trim_count: trim_count,
            tools_count: tools_count,
            consumables_count: consumables_count,
            fill_count: fill_count,
            finish_count: finish_count,
            install_count: install_count,
        }).create()

И модель LineItem:

def add_product(product_id, attr)
        current_item = line_items.find_by(product_id: product_id)
        if current_item
            current_item
        else
            current_item = line_items.build(
                product_id: product_id,
                whole_count: attr[:whole_count],
                trim_count: attr[:trim_count],
                tools_count: attr[:tools_count],
                consumables_count: attr[:consumables_count],
                fill_count: attr[:fill_count],
                finish_count: attr[:finish_count],
                install_count: attr[:install_count],
                )
        end
        current_item
    end

Ещё вопросы

Сообщество Overcoder
Наверх
Меню