我正在尝试从前端的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'
答案 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