Rails 4 - destroy action删除错误的记录

时间:2015-08-19 12:31:44

标签: ruby-on-rails ruby ajax ruby-on-rails-3

我正在向rails传递一个ajax请求,传入数据id。

这里是ajax

function delete_availability(id) {
    var id = id;

    $.ajax({
      type: "DELETE",
      url: "/events/" + id,
      statusCode: {

        200: function() {
          //alert("200");
        },
        202: function() {
          //alert("202");
        }
      },
      success: function(data) {

        console.log('availability deleted');

      },
      error: function(xhr) {
        alert("The error code is: " + xhr.statusText);
      }
    });
  }

我的销毁行动

def destroy

    @event = Event.find_by(params[:id]);

    respond_to do |format|
      if @event.destroy
        format.json {
          render json: {}
        }
      end
    end
  end

我的活动模型中没有任何内容

class Event < ActiveRecord::Base

end

问题是即使rails收到正确的id,当它用于销毁时,它会改变id并破坏下一个。

这是 rails log:

Processing by EventsController#destroy as */*
  Parameters: {"id"=>"66"}
  Event Load (0.1ms)  SELECT  "events".* FROM "events" WHERE (66) LIMIT 1
   (0.0ms)  begin transaction
  SQL (0.2ms)  DELETE FROM "events" WHERE "events"."id" = ?  [["id", 65]]
   (2.4ms)  commit transaction
Completed 200 OK in 6ms (Views: 0.1ms | ActiveRecord: 2.8ms)
谁知道为什么?

2 个答案:

答案 0 :(得分:6)

您应该使用Event.find(params[:id])Event.find_by(id: params[:id])

您的代码会发生的事情是SQL查询发现每个事件 - WHERE (66)对于任何记录都是真的 - 而find_by从该集合中获取第一条记录,并且它会被销毁。请求中的ID并不重要。

答案 1 :(得分:1)

当您想要使用不同的属性进行搜索时,为什么要使用find_by

Event.find(params[:id])

如果你想在没有找到记录

的情况下不抛出异常,请使用find_by_id
Event.find_by_id(params[:id])

或者,如果您仍然想使用find_by,您可以使用,如果没有找到记录,则返回nil:

Event.find_by(id: params[:id])

如果找不到包含此ID的记录,请使用find_by!来解决异常:

 Event.find_by!(id: params[:id])