Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Rails JS链接在控制器上处理两次_Jquery_Ruby On Rails_Ajax_Ruby On Rails 4 - Fatal编程技术网

Jquery Rails JS链接在控制器上处理两次

Jquery Rails JS链接在控制器上处理两次,jquery,ruby-on-rails,ajax,ruby-on-rails-4,Jquery,Ruby On Rails,Ajax,Ruby On Rails 4,在我正在编写的应用程序中看到一些奇怪的行为。我有一个显示记录列表的索引页。如果我创建了一个新记录,它将被插入到数据库中,然后用户将被重定向到现在显示新记录的索引页面。每条记录都有一些AJAX投票链接。当用户单击新项目上的投票链接时,我看到控制器使用两个不同的IP地址处理了两次请求……此外,我正在为每个用户在永久cookie中存储一个UUID,来自第二个IP地址的第二个请求显示的UUID与当前用户的UUID不同 我只在我朋友的办公室看到过这个问题,所以我不知道是因为他们的网络混乱还是什么原因(有代

在我正在编写的应用程序中看到一些奇怪的行为。我有一个显示记录列表的索引页。如果我创建了一个新记录,它将被插入到数据库中,然后用户将被重定向到现在显示新记录的索引页面。每条记录都有一些AJAX投票链接。当用户单击新项目上的投票链接时,我看到控制器使用两个不同的IP地址处理了两次请求……此外,我正在为每个用户在永久cookie中存储一个UUID,来自第二个IP地址的第二个请求显示的UUID与当前用户的UUID不同

我只在我朋友的办公室看到过这个问题,所以我不知道是因为他们的网络混乱还是什么原因(有代理/防火墙等的公司网络……我听说管理不善)。我觉得奇怪的是,这种情况只发生在新记录上,而不是在点击已有记录上的投票链接(使用相同的代码)时

这是显示控制器响应的日志-注意,一个响应被处理为JS,第二个响应被处理为*/*:

Started GET "/vote/14?vote_value=-1" for <company's external IP> at 2014-07-02 16:31:41 -0400
Processing by FoosController#voting as JS
  Parameters: {"vote_value"=>"-1", "foo_id"=>"14"}
  Foo Load (0.7ms)  SELECT "food".* FROM "food" WHERE "food"."id" = $1 ORDER BY created_at DESC LIMIT 1  [["id", "14"]]
   (0.3ms)  BEGIN
  SQL (0.8ms)  INSERT INTO "votes" ("created_at", "updated_at", "uuid", "value", "foo_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Wed, 02 Jul 2014 20:31:41 UTC +00:00], ["updated_at", Wed, 02 Jul 2014 20:31:41 UTC +00:00], ["uuid", "61230391-311a-4358-9c4b-665d2a8bc8e9"], ["value", -1], ["foo_id", 14]]
   (2.0ms)  COMMIT
   (0.2ms)  BEGIN
   (0.3ms)  COMMIT
  Rendered foo/voting.js.erb (0.1ms)
Completed 200 OK in 14ms (Views: 2.2ms | ActiveRecord: 4.3ms)


Started GET "/vote/14?vote_value=-1" for <different unrecognized IP> at 2014-07-02 16:31:41 -0400
Processing by FoosController#voting as */*
  Parameters: {"vote_value"=>"-1", "foo_id"=>"14"}
  Foo Load (0.6ms)  SELECT "food".* FROM "food" WHERE "food"."id" = $1 ORDER BY created_at DESC LIMIT 1  [["id", "14"]]
   (0.3ms)  BEGIN
  SQL (0.7ms)  INSERT INTO "votes" ("created_at", "updated_at", "uuid", "value", "foo_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Wed, 02 Jul 2014 20:31:41 UTC +00:00], ["updated_at", Wed, 02 Jul 2014 20:31:41 UTC +00:00], ["uuid", "b8a23470-9f9f-4a65-8577-7da7e31a6995"], ["value", -1], ["foo_id", 14]]
   (1.7ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
  Rendered foo/voting.js.erb (0.2ms)
Completed 200 OK in 13ms (Views: 2.4ms | ActiveRecord: 3.5ms)
以及响应js.erb文件:

score = $('#foo-' + <%= @foo.id %> + '-score');
score.html(<%= @foo.score %>);
score=$('foo-'+'-score');
score.html();
关于如何对此进行故障排除或确保它不是应用程序问题,并且是此特定站点的网络问题,您有何想法?我无法在办公室复制。我使用Firebug检查浏览器发出的请求,看起来只有一个请求被发送出去。这只是一个配置错误的网关/路由器/防火墙等问题吗。。。以某种方式复制请求?它发送两个不同UUID的事实似乎很重要,但我无法想象为什么它只在新条目上发生


谢谢

如果它来自一个位置,那么它就不是来自您的代码。它可能是一个病毒,一个设置糟糕的缓存代理,一个网络扫描机器人,或者其他任何东西

防止代码重复输入是一件好事,但看起来相当复杂。示例:由于负载平衡代理,您不能依赖源IP

无论如何,你可以尝试(我认为你必须这样做):

1-您正在使用GET请求,我从您的日志中看到已在数据库中完成了插入。这与RESTfull解决方案背道而驰。只有POST请求才会触发插入。您应该更改代码以反映这一点,无论这有多困难

2-一旦您为该操作正确设置了POST请求,您必须通过在标题中使用
csrf\u meta\u标记来强制rails以防止跨脚本请求,并在控制器中使用
protect\u免受伪造

我真的希望这能解决问题,放弃第二个请求。在开始这样的修改之前,请确保您的测试套件已经完全覆盖了您的代码,因为如此深刻的更改可能会导致意想不到的结果,特别是对于AJAX表单或多部分表单


它很复杂,而且可能很长,但从我现在看到的日志来看,您的服务器似乎没有受到保护。

好吧,如果这是来自一个位置,您不应该对代码进行调查,除非您需要防止重复输入。是的,到目前为止,它指向一个外部问题。。。我确实计划对此进行防御性编码,但我很好奇,如果有人看到过这一点或有类似的问题,我已经改变了获取帖子的方式(这是我的疏忽),但是我已经在我的application.html.erb中使用了,并且在我的应用程序控制器中使用了protect_from_fraze…还有其他想法吗?在更改GET to POST后,您是否仍然收到双重请求?当我可以在同一位置再次测试任何结果时,会通知您吗?你修好了吗?还没有,还没有回到我朋友的办公室去尝试…但是,值得一提的是,我没有在任何其他地方看到这个错误,所以它可能是他网络上配置错误的设备。当我可以在相同的环境中再次测试时,我肯定会发布更多信息。。。
def voting
    @foo = Foo.find(params[:foo_id])

    vote = @foo.votes.create(uuid: cookies[:user_uuid], value: params[:vote_value])

    @foo.save

    respond_to do |format|
      format.html { redirect_to root_path }
      format.js { render 'voting' }
    end
  end
score = $('#foo-' + <%= @foo.id %> + '-score');
score.html(<%= @foo.score %>);