1

因此,我正在尝试填充一个下拉菜单,该菜单根据在另一个下拉列表中选择的客户来显示某些客户项目。我正在使用 javascript 执行此操作,在项目控制器中调用函数“byProjectId”。

$("#customer_id").bind( "change", function(){
  $("#task_project_id").empty();
    $.ajax({
      type: 'GET',
      url: '/projects/byCustomerId/' + $(this).val(),
      dataType: 'script'
    })
});

我的 byCustomerId 函数如下:

def byCustomerId
  logger.debug "DEBUGGING HERE"
  if params[:id].present?
    @projects = Customer.find(params[:id]).projects.order(:name)
  else
    @projects = []
  end

  respond_to do |format|
    format.js
  end
end

所以我所做的就是根据传递的客户 ID 值检索项目列表。但是,当我实际运行它时,会在实际执行此方法中的代码之前进行一些额外的数据库调用。这是运行 rails 服务器的控制台的输出:

Started GET "/projects/byCustomerId/5?_=1342642985360" for 127.0.0.1 at 2012-07-
18 15:23:05 -0500
Processing by ProjectsController#byCustomerId as JS
Parameters: {"_"=>"1342642985360", "id"=>"5"}
←[1m←[36mMember Load (1.0ms)←[0m  ←[1mSELECT "members".* FROM "members" WHERE
"members"."id" = 7 LIMIT 1←[0m
←[1m←[35mProject Load (0.0ms)←[0m  SELECT "projects".* FROM "projects" WHERE "
projects"."id" = 5 LIMIT 1
Completed   in 69ms

ActiveRecord::RecordNotFound (Couldn't find Project with ID=5):

这表明它正在尝试请求 ID 为 5 的所有 PROJECTS,即使 5 是它应该请求的客户 ID。当我使用另一个恰好是有效 ProjectID 的 CustomerID 时,它会在此之后立即运行正确的调用,但不会发生 RecordNotFound 异常:

DEBUGGING HERE
←[1m←[36mCustomer Load (0.0ms)←[0m  ←[1mSELECT "customers".* FROM "customers"
WHERE "customers"."id" = 1 LIMIT 1←[0m
←[1m←[35mProject Load (1.0ms)←[0m  SELECT "projects".* FROM "projects" WHERE (
"projects".customer_id = 1) ORDER BY name

“在这里调试”是我意识到这些调用是在我的 byCustomerId 函数中的代码之前进行的唯一方法。如果我传递的客户 ID 作为项目 ID 也是有效的,它会返回正确的数据并正确填充,只需对来自不正确 sql 调用的数据执行任何操作,但是当客户 ID 与项目 ID 不匹配时,这些对数据库的额外调用得到异常并且没有填充任何内容,即使以后的查询仍然可以。我无法弄清楚这些对数据库的额外调用来自哪里?我是否只是通过将任何数据发送到项目控制器或其他方式来调用它们?

4

0 回答 0