Rails应用程序 - 通过ajax请求将值传递给记录

时间:2015-09-28 18:57:06

标签: jquery ruby-on-rails ajax

在涉及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记录中。)

2 个答案:

答案 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中,但只需更新表单中的字段值(隐藏或其他),该值将作为表单的一部分提交。