如何使用Ajax向我的Rails控制器发出POST请求?

时间:2014-07-14 17:36:54

标签: jquery ruby-on-rails ruby ajax post

我正在尝试从前端的JavaScript游戏状态向我的控制器和数据库发送信息。 我没有得到任何回复,我也不确定原因。

这是使用Ajax的侦听事件,包含我要发送的变量值(score)。

$("#link-to-hq").click(function(){
 test = $.ajax({
          type: "POST",
          url:    "/users/:id",
          data: {dollars: score},
          datatype:"html",
          async: true
        });
});

它听的按钮:

</script>

<%= link_to "Home", user_path(@user), id: 'link-to-hq' %> 

我尝试击中的路线:

PATCH  /users/:id(.:format)                     users#update

然后,这是我的控制器:

def update
    @user = User.find(params[:id])
    new_dollars = params[:dollars]
    #store to database
    @user.dollars<<new_dollars
 end

我似乎没有得到任何反馈。我的请求或控制器是否制定错误?

编辑1

我确实根据建议更改了请求:

$("#link-to-hq").click(function(){
  test = $.ajax({
          type: "PATCH",
          url:    "/users/<%= @user.id %>",
          data: {dollars: score},
          datatype:"html",
          async: true
        });
});

它仍然没有反应。

继承我的开发日志信息。有错误:

Started PATCH "/users/0" for 127.0.0.1 at 2014-07-14 13:52:30 -0400
Processing by UsersController#update as */*
  Parameters: {"dollars"=>"1", "id"=>"0"}
  [1m[35mUser Load (0.6ms)[0m  SELECT  "users".* FROM "users"  WHERE                  "users"."remember_token" = '5b38b7021d2e00f6aecc21b29e2322d4f988c6eb' LIMIT 1
  [1m[36mUser Load (0.4ms)[0m  [1mSELECT  "users".* FROM "users"  WHERE "users"."id"    = $1 LIMIT 1[0m  [["id", 0]]
Completed 400 Bad Request in 5ms

ActionController::ParameterMissing (param is missing or the value is empty: user):
  app/controllers/users_controller.rb:85:in `user_params'
  app/controllers/users_controller.rb:66:in `update'

2 个答案:

答案 0 :(得分:2)

POST适用于new次请求。

尝试:

type: "PATCH",

我相信这也会奏效:

type: "PUT",

另外,请确保将:id指定为实际数字。

答案 1 :(得分:0)

要扩展beautifulcoder的准确答案,您需要将类型与您尝试命中的路线对齐,并确保在ajax URL中使用实数。您已将URL更改为引用@user,但Javascript无法引用Ruby变量。

解决当前问题的最简单方法是将Ruby变量传递给视图中的数据属性:

# your view
<element id="some_id" data-user_id="<%= @user.id %>"></element>

# your javascript/jquery

$("#link-to-hq").click(function(){
  var id = $('#some_id').data('user_id');
  test = $.ajax({
      type: "PATCH",
      url:    "/users/" + id,
      data: {dollars: score},
      datatype:"html",
      async: true
    });
});

如果用户是当前用户,并且您拥有或可以创建current_user帮助程序,那么您也可以执行操作:id independent:

# javascript/jquery
$("#link-to-hq").click(function(){
  test = $.ajax({
      type: "PATCH",
      url:    "/users/update",
      data: {dollars: score},
      datatype:"html",
      async: true
    });
});

# routes.rb
PATCH  /users/update                   users#update

#users_controller.rb
def update
  @user = current_user
  new_dollars = params[:dollars]
  #store to database
  @user.dollars<<new_dollars
end