在涉及AJAX请求时,我正在努力使用URL参数。我基本上想要做的是 - 我的页面上有一个小计算器(它是一个商店),结果显示在div #priceValue中。我想通过Ajax将该值传递给我的记录。
所以这是我的观点:
=form_for :line_item, url: line_items_path(product_id: @product.id), remote: true do |f|
...some fields and calculator goes in there...
=button_tag(type: 'submit', id: 'add_item_to_cart', class: 'btn btn-primary shopping-cart-btn') do
%i.fa.fa-shopping-cart
Buy
Lineitems是一种连接模型,因为它们包含有关商品所属的购物车,原始商品(它的ID)和金额的信息。我想将:卖出价值,即客户的最终购买价格,传递给lineitems记录。
由于我在产品#show控制器中将商品添加到购物车,我尝试编辑products.coffee来进行ajax调用:
$(document).ready ->
$('div.box form').submit (event) ->
url = $(this).attr('action')
sellprice = parseInt( $('#priceValue').text(), 10)
# console.log(url) <- this works
# console.log(sellprice) <- this works
$.ajax
type: 'PUT'
url: url
data: { line_item: { sellprice: sellprice } }
dataType: 'json'
success: (json) ->
console.log('success')
但是我收到PUT http://localhost:9292/line_items?product_id=5 404 (Not Found)
错误。
这是我的网络标签显示的内容 - http://take.ms/s4zie
我试图遵循codechool 5级指南,甚至编写自定义方法:
def sellprice
@line_item = LineItem.find(params[:id])
@line_item.sellprice = params[:line_item][:sellprice]
@line_item.save
respond_to do |format|
format.js
format.json { render json: @line_item.to_json(only: :sellprice) }
end
end
并制作了这条路线:
resources :line_items do
put :sellprice, on: :member
end
标题中的我甚至看到了所需的值:
Query String Parameters
product_id:5
Form Data
line_item[sellprice]:880
但是我无法让它发挥作用...请不要对我很苛刻,我肯定会遗漏一些基本的东西,但Ajax对我来说是一个全新的世界(另一方面,我不知道如何将JS值传递到Rails记录中。)
答案 0 :(得分:0)
我认为您只需要将表单定义中的路由名称更改为以下内容:
= form_for :line_item, url: line_item_path(@product.id), remote: true do |f|
此外,如果您可以将售价设置为更新方法的一部分,那么最好不要使用额外的控制器方法。
答案 1 :(得分:0)
我认为你有两个问题。首先,正如Ben指出的那样,你的网址是错误的。它需要像/line_items/5
。如果您将form_for中的line_items_path(product_id: @product.id)
更改为line_items_path(@product)
,则应该会生成正确的网址。
你的第二个问题是你基本上是在做两次ajax请求 - 一次从咖啡脚本作为PUT(对于url的更改应该是正确的)和一次从form_for进行远程设置为true。 form_for正在进行&#34; POST&#34;请求,因为你没有在那里指定方法。
我建议将put方法(或创建POST路由)添加到form_for(method: :put
)并删除执行ajax的coffeescript。如果您需要来自浏览器的信息来填充sellprice,请将该逻辑保留在coffeescript中,但只需更新表单中的字段值(隐藏或其他),该值将作为表单的一部分提交。