web-dev-qa-db-ja.com

Ruby on Rails action "destroy"が "delete"という名前ではないのはなぜですか?

CRUDの原則 は、永続データに対する4つの基本的な操作を定義します。

  • 作成、
  • 読んだ、
  • 更新、
  • 削除します。

HTTP動詞もDELETEWordを使用します。

Railsのデフォルトルーティング がHTTP動詞に対応するアクションに「destroy」という単語を使用するのはなぜですか[〜#〜]削除[〜#〜]

33
Haralan Dobrev

Railsは4つの標準的な方法(動詞)を使用します。

  • GET
  • POST
  • プット
  • 削除

さらに、7つのRESTfulアクションがあります。

  • インデックス
  • 新着
  • 作成する
  • 編集
  • 更新
  • 公演
  • 破壊

Railsは、対応するアクションと同じ動詞を使用することはありません。アクションdestroyにルーティングすると、コントローラー内の対応するアクションを介して、複数のDELETEを実行できます。

このrailsguideはあなたの興味を引くかもしれません: http://guides.rubyonrails.org/routing.html

説明

ブラウザは、GET、POST、PUT、DELETEなどの特定のHTTPメソッドを使用してURLをリクエストすることにより、Railsからページをリクエストします。各メソッドは、リソースに対して操作を実行するためのリクエストです。リソースルートは、関連する多数のリクエストを単一のコントローラー内のアクションにマップします。

ここで、HTTP GETリクエストがあると想像してください。これは、データの読み取り/取得が必要であることを意味します。アクションの名前が動詞(この場合はGET)と同じである場合、それは過度に単純化されます。 GETは、表示、インデックス作成、新規、または編集アクションへのアクセスを許可できます。それらはすべてデータを読み取りますが、アクション自体は間違いなく同じではありません。 DELETEリクエストについても同じことが言えます。この要求はコントローラーを介して処理され、アクション内でさまざまな実装を持つことができます。投稿を破棄したい場合もありますが、ユーザーセッションからログアウトしたい場合もあります。削除と呼ばれるアクションがあるだけでは、コントローラーを介してそれに関連する可能性を正当化することはできません。

編集

ブラウザからのリクエストがどのように処理されるかについて詳しく知りたい場合は、Railsが使用するM(odel)V(iew)C(ontroller)-modelに関する情報を読むことができます。

http://www.youtube.com/watch?v=3mQjtk2YDkM&noredirect=1

そして:

http://betterexplained.com/articles/intermediate-Rails-understanding-models-views-and-controllers/

このリンクからの引用:

ブラウザが次のようなリクエストを行います http://mysite.com/video/show/15 Webサーバー(mongrel、WEBrickなど)がリクエストを受信します。ルートを使用して、使用するコントローラーを見つけます。デフォルトのルートパターンは、config /routes.rbで定義されている「/ controller/action/id」です。

つまり、最初のリクエストはWebサーバーを介して変換および処理され、destroyなどのRESTfulアクションが配置されているコントローラーを介して正しいルートを定義する必要があります。

Railsの初期には、動詞はGETとPOST(PUTとDELETEがサポートされていないため、後のバージョンのRails))の2つしかありませんでした。隠し変数を介してPUTとDELETEを追加します。リクエストとアクションは2つの異なるものであるため、破棄アクションの名前は変更されません。

Actions || show  || create || update || destroy
SQL     || select|| create || update || delete
REST    || get   || post   || post   || post

Actions || show  || create || update || destroy
SQL     || select|| create || update || delete
REST    || get   || post   || put    || delete

この引用はさらに興味深いかもしれません:

「ルーターはHTTP動詞とURLを使用してインバウンド要求を照合するため、4つのURLが7つの異なるアクションにマップされます。」

http://guides.rubyonrails.org/routing.html

25
Peter de Ridder

モデル部分については、ここに http://www.nickpeters.net/2007/12/21/delete-vs-destroy/ からの素晴らしい要約があります:

Deleteメソッドは、基本的にデータベースから行(または行の配列)を削除します。一方、破棄では、さらにいくつかのオプションが可能になります。まず、before_deleteなどのコールバック、またはモデルで指定した依存関係をチェックします。次に、削除されたばかりのオブジェクトをメモリに保持します。これにより、「注文番号{order.id}が削除されました」などのメッセージを残すことができます。最後に、そして最も重要なこととして、そのオブジェクトに関連付けられている子オブジェクトもすべて削除されます。

それを知っていると、コントローラーのアクションをモデルのアクションと同じように呼び出すことだけが意味があります。 削除は単純すぎます

6
mathieugagne

これがライアン・ベイツからの非常に早い(2007年)回答です

基本的に、「削除」は、レコードを削除するためにデータベースに直接クエリを送信します。その場合、Railsは、削除するレコード内の属性も、コールバック(before_destroyなど)があるかどうかもわかりません。

「destroy」メソッドは渡されたIDを受け取り、「find」メソッドを使用してデータベースからモデルをフェッチし、その上でdestroyを呼び出します。これは、コールバックがトリガーされることを意味します。

コールバックをトリガーしたくない場合、またはパフォーマンスを向上させたい場合は、「削除」を使用することをお勧めします。それ以外の場合(そしてほとんどの場合)、「破棄」を使用することをお勧めします。

ソース

2
Chuntao Lu

良い質問。

オブジェクトにはdestroyではなく常にdeleteを使用することをお勧めします。

実際、deleteはコールバックをトリガーしません。

2
apneadiving