2009-06-04 19 views
1

私のRailsアプリケーションでリソースを破壊した後、ユーザーはリンクをクリックしてそれを復元することができます。REST MVCアプリケーションで復元アクションを処理する場所は?

現在、この復元アクションは、対応するリソースコントローラのdestroyメソッドにルーティングされます。

このメソッドは、データベース内のリソースを検出すると、そのリソースを破棄し、そのレコードをごみ箱に移動します。

データベース内のリソースが見つからない場合は、ゴミ箱内のリソースを検索し、リソースを見つけたらリストアします。

私はこの方法ではあまり満足していません。破壊方法には、破壊と回復という2つの目的があります。

私はコントローラで専用のリストアアクションを作成できますが、RESTの方法では、リストア要求処理はどこに配置しますか?専用コントローラでは?もしそうなら、どの方法でPUTかPOSTか?

答えて

1

POSTは非冪等であり、同じPOST要求を何度も送信すると、多くの新しいアイテムが得られます。同一リソース上で起こっている同じ更新が複数回実行された場合に副作用がないため、PUTは冪等でなければなりません。

このアクションを実行する場所は、Railsコントローラをきれいにして整理しておくよりも、あなたの美的感受性とハードコアをどのようにしてRESTにするかによって異なります。

DeletedBobがBobと異なるリソースであることは間違いありません。 DeletedBobsControllerに送信されたPUTは、DeletedBobリソースを、おそらく "deleted = false"のようなパラメータで更新して、更新の目的を示すと言うことができます。

「削除」をリソースと見なすこともできます。次に、 "resource_type = bob & resource_id = 23"のパラメータで、DeletionsControllerでDELETEを使用できます。削除を破棄すると、元のオブジェクトが復元されます。後続の同一の呼び出しでは、DELETEで期待されるように、「オブジェクトが見つかりません」というエラーが発生します。

ロイ・フィールディング(RESTを定義している論文の元の著者)が出て、実際にはnothing wrong with POSTと言われて以来、私は追加の:put => :restoreメソッドとルートをBobsControllerに定義することを検討します。別のプログラマーがそれを期待しているところにコードを保持しており、おそらくこの種のデザインの聴衆はそうです。

0

アクションはリソース上にあるので、機能はResourceControllerに存在する必要があると思います。 RESTfulアーキテクチャーの私の研究の要点の1つは、PUTとPOSTの間の決定についての経験則は、POSTが作成に使用され、PUTが更新に使用されるということです。この場合、私は、リソースが「存在する」ことを期待し、あなたはそれがあなたのPUTを使用して、URIのようなものだろう復元ということ状態です更新している:私はRESTを考える

http://example.com/resources/restore/ {ID}

2

Puristは、TrashControllerによって処理されるTrashという新しいリソースを作成します。リストアを処理するには、リストアと呼ばれるTrashControllerに対するアクションが必要です。

URLは次のようになります。

http://example.com/trash/restore/{resourceId} 
+0

この多形を作ることで、アプリケーション全体で複数の異なるオブジェクトを復元するために同じコントローラを使用することができますか? – ErsatzRyan

+0

すべてのタイプのリソース用に1つのゴミ箱テーブルがある場合、おそらくそれをTrashControllerのパラメータにします: http://example.com/trash/restore?id={resourceId}&type={resourceType} Ifオブジェクトの種類ごとにゴミ箱のテーブルがあり、リソースコントローラにリストアメソッドを置くことになるでしょう。 – DSO

0

私はショーンが上記右のトラックにあったと思いますが、私はさらに一歩それを取るでしょう。リソースをtrash=1で更新するゴミ処理をPOSTにしてください。リクエストは全体のリソース、リソースの一部だけの更新を送信していない特定のPOSTで間違った方法PUTを置き換え:その後、復元はちょうど別のPOSTtrash=0

EDITと同じリソースにあります。

関連する問題