2017-01-09 8 views
0

DOMアイテムを右クリックすると、jQuery-contextMenuツールで実装されたコンテキストメニューが表示されるRailsアプリケーションがあります。ユーザーがそのメニュー内の項目をクリックすると、Railsアクションが実行されます。これまではすべてこれが実際に動作します。次に、データの変更された状態でページをリフレッシュする必要があります。 Railsのデバッグコンソールは、ページが正しく表示されているが、ブラウザに違いはないと主張しています。私は間違って何をしていますか?jQueryはRailsコマンドを実行しますが、結果は表示しません

これはHTMLページ内のコンテキストメニューを表すスクリプトです。 deletenodeオプションをクリックすると、$。post要求が発行されます。これによりレールルートに

<script> 
    $(function(){ 
     $('#treemenu').contextMenu({ 
      selector: 'span', 
      callback: function(key, options) 
      { 
       var nodeID = parseInt($(this).attr("id").substring(13), 10); 
       if(key == "deletenode") 
       { 
        $.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }); 
       } 
       else if(key == "deletearc") 
       { 
       } 
       else 
       { 
       } 
//    window.console && console.log(m) || alert(m); 
      }, 
      items: 
      { 
       "deletenode": {name: "<%= t('ontologies.delete.delete_node') %>"}, 
       "deletearc": {name: "<%= t('ontologies.delete.delete_arc') %>"}, 
      } 
     }); 
    }); 
</script> 

、これはこれにつながることコントローラ

def delnode 
    logger.debug 'Entered delnode ' + params[:id] 
    redirect_to ontologies_url, alert: 'testing delnode.' 
end 

でアクションをレールと、これは、デバッガコンソールに出力されます。それが200を完了したと言うように、それは実際にokであるべきです。しかし、インデックスアクションへのリダイレクトは実際には起こっていません。

Started POST "/ontology/1/delnode" for ::1 at 2017-01-08 19:04:52 -0800 
Processing by OntologiesController#delnode as */* 
    Parameters: {"id"=>"1"} 
    User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
Entered delnode 1 
Completed 200 OK in 5ms (Views: 0.5ms | ActiveRecord: 1.0ms) 

他の投稿にはさまざまなことが示唆されていますが、ページは表示されません。ご協力ありがとうございました。

答えて

2

delnode ajaxリクエストから経路とメソッドが呼び出されています。したがって、redirect_toメソッドは、コールバックによって処理されない302コードをレンダリングします。

可能な解決策は、200コード(「OK、私はノードを削除しました」のような操作の成功)をレンダリングし、ajax doneコールバックでは、リダイレクトで成功を処理します。そのような

何か:

レール:

def delnode 
    logger.debug 'Entered delnode ' + params[:id] 
    #destroy logic... 
    #if ok: 
    head 200 #renders nothing 
end 

JS:AJAX要求で

$.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }).done(function(data, textStatus, jqXHR) { 
    location.reload(); //javascript refresh your page 
}); 
+1

は、mrlew、ありがとうございました。それは問題を非常にうまく解決しました。 –

1

、あなたはコントローラにredirect_toメソッドを使用することはできません。 HTMLコード、モデルからのデータ、コントローラ内のデータはレンダリングできます。

ので、コードを使用:JSで

render :nothing => true 

または

render data: {status: true}.to_json 

$.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }).done(function(response) { 
    console.log("response: "+ response.status) //you will get true in response 
    window.location.reload(); //reload the page if you want to reload 
}) 
+0

ありがとう、puneet18。それも問題を解決します。 –

関連する問題