У меня есть калькулятор (для подсчета количества отсчетов продукта и дополнительных позиций), написанного на 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. Но:
Я не могу найти продукт по id в rails Контроллер LineItem (продукт = Product.find(product_params) - ОШИБКА)
И я не знаю, как передать расчетную информацию контроллеру рельсов и как справиться с этим, чтобы я мог просматривать эту рассчитанную информацию в корзине? (например, @cart.line_items.whole_count)
Когда вы это сделаете:
product = Product.find(product_params)
Вы передаете {"product_id" => 2}
качестве параметра для find
. Это неверно, вместо этого вы должны сделать следующее:
product = Product.find(product_params[:product_id])
find
принимает только идентификатор записи в БД.
Наконец, я кодирую так:
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