0

私は本当にイライラする問題を抱えています。フローは次のとおりです。

モデル プロジェクトとモデル テストがあります。プロジェクトには多くのテストがあります。

プロジェクトのshowページで、次のように「テストを追加」ボタンを押します。

<%= link_to "Add test", new_project_test_path, :remote => true %>

これはnewmy のメソッドを呼び出します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 コンソールで確認しました。

4

2 に答える 2

0

更新の http 動詞は PUT になります。投稿ではありません。

これは、ユーザー リソースの自動生成ルートです。

POST   /users(.:format)                                          users#create

PUT    /users/:id(.:format)                                      users#update

レーキ ルートを行う | grep テストを実行し、以下のようなルートがあるかどうかを確認します

POST /projects/:project_id/tests/:id テスト#更新

カスタム ルートとして追加していない場合は見つかりません。

これを修正するには、メソッドを更新フォームに明示的に指定します。または、フォームをここに投稿してください。

于 2013-09-11T18:13:05.877 に答える