そのため、別のドロップダウンで選択された顧客に基づいて、特定の顧客プロジェクトを表示するドロップダウン メニューを設定しようとしています。プロジェクトコントローラーで関数「byProjectId」を呼び出して、javascriptを使用してこれを行っています。
$("#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 であるにもかかわらず、ID が 5 のすべてのプロジェクトを要求しようとしていることを示しています。たまたま有効な 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
「DEBUGGING HERE」は、これらの呼び出しが byCustomerId 関数のコードの前に行われていることに気付いた唯一の方法です。渡した顧客 ID がプロジェクト ID としても有効である場合、正しいデータが返され、正しく入力され、正しくない SQL 呼び出しからのデータは何も処理されませんが、顧客 ID がプロジェクト ID と一致しない場合、データベースへのこれらの余分な呼び出しは例外を取得し、後のクエリがまだ問題ない場合でも、何も入力されません。データベースへのこれらの余分な呼び出しがどこから来ているのかわかりませんか? プロジェクトコントローラーなどにデータを送信するだけで、どういうわけかそれらを呼び出していますか?