私は本当にイライラする問題を抱えています。フローは次のとおりです。
モデル プロジェクトとモデル テストがあります。プロジェクトには多くのテストがあります。
プロジェクトのshow
ページで、次のように「テストを追加」ボタンを押します。
<%= link_to "Add test", new_project_test_path, :remote => true %>
これはnew
my のメソッドを呼び出しますtests_controller
:
def new
@project = Project.find(params[:project_id])
@test = Test.new
end
これはリモート呼び出しであるため、new.js.erb
後で呼び出されます。
$("#tests_table").append("<%= escape_javascript(render 'form', test: @test, project: @project) %>")
これにより、次で始まるフォーム _form.html.erb が表示されます。
<%= form_for([@project, test], :remote => true ) do |f| %>
create
フォームに入力した後、メソッドを呼び出す送信ボタン (「Create Test」) を押します。
def create
@project = Project.find(params[:project_id])
@test = @project.tests.create(test_params)
end
end
フォームはリモートであるため、これはcreate.js.erb
完了後に呼び出されます。
$("#tests_table").append("<%= escape_javascript(render 'test', test: @test, project: @project) %>");
これにより、次の内容が追加されます_test.erb.html
。
<%= render "tests/form", test: test, project: @project %>
テスト行は常に編集可能な状態にあるため、_test パーシャルが続いてフォームを再度表示します。
新しい行が正しい値で挿入され、送信ボタンに「テストの更新」と表示されます。
ただし、この新しく挿入されたフォームで Update Test をクリックすると、フォームが通過せず、Javascript コンソールに POST リクエストが失敗したことが示されます。
一致するルートがありません [POST] "/projects/5230920870dbf2ba260000e8/tests/5230ae3970dbf2ec30000239"
どうすればいいの?その ID を持つ新しいテスト オブジェクトが存在し、それは 100% の事実です。Railsコンソールで取得できます。ページを更新してから [テストの更新] をクリックすると、処理が完了します。しかし、Javascriptを介して行を新しく挿入し、更新テストを押した場合にのみ、それは通過しません。ここに怪しいものはありますか?
私routes.rb
は持っています:
resources :projects do
resources :tests
end
その URL に対して POST 要求を実行でき、ページ全体の更新時に機能することを覚えておいてください。ただし、オブジェクトが新しく、フォームが Javascript で動的に挿入されると、怪しいことが起こります。
関連する rake ルートの出力:
project_tests GET /projects/:project_id/tests(.:format) tests#index
POST /projects/:project_id/tests(.:format) tests#create
new_project_test GET /projects/:project_id/tests/new(.:format) tests#new
edit_project_test GET /projects/:project_id/tests/:id/edit(.:format) tests#edit
project_test GET /projects/:project_id/tests/:id(.:format) tests#show
PATCH /projects/:project_id/tests/:id(.:format) tests#update
PUT /projects/:project_id/tests/:id(.:format) tests#update
DELETE /projects/:project_id/tests/:id(.:format) tests#destroy
更新された詳細
JS コンソールをもう少し調べたところ、次の詳細が見つかりました。
ページに入ったときに既に存在していたフォームで [テストの更新] をクリックすると、フォーム データが次のように表示されます。
その呼び出しは 200 Success を返します。
ただし、上記の手順で JS を介して動的に追加されたフォームで Update Test を実行すると、次のように表示されます。
そして、それは 404 not found で失敗します。
2 番目のケースでフォームが _patch を使用していないのはなぜですか? この回答は、オブジェクトが永続化されている場合、フォームは PUT を使用する必要があることを示しており、オブジェクトが実際に永続化されていることを Rails コンソールで確認しました。