好的,雖然GitHub發生故障,但代碼設計問題:
我總是在Rails應用程序(通常是)中使用非標準REST風格的動作獲得分析癱瘓。Rails中的非REST風格的動作
我有喬布斯,我希望能夠取消(和重新激活)他們。這不像設置複選框那麼簡單;還有其他一些事情需要發生,所以我不能只使用現有的JobsController#update
操作。
這裏是我的選擇,因爲我看到它:
只需添加cancel
和reactivate
到現有作業控制器。 的路線是這樣的:
POST /admin/jobs/cancel/:job_id
POST /admin/jobs/reactivate/:job_id
(不REST風格;假設這是一個壞主意)
2.與create
和destroy
操作創建JobCancellationsController
。 重新激活作業是destroy
-ing a JobCancellation
資源。
我將使用嵌套的路線按如下:
resources :jobs, except: :show do
resource :job_cancellation, only: [:create, :destroy]
end
在默認情況下會給我像
一)
POST /admin/jobs/:job_id/job_cancellation
DELETE /admin/jobs/:job_id/job_cancellation
我可以整理路線投案自首,而不更改控制器,如下所示:
b)
POST /admin/jobs/:job_id/cancellation
DELETE /admin/jobs/:job_id/cancellation
雖然這看起來不太直觀 - '取消'會更好,因爲cancel
。所以,我可以改變路線,同時保持控制器相同:
C)
POST /admin/jobs/:job_id/cancel
DELETE /admin/jobs/:job_id/cancel
這第一條路現在是有道理的(雖然它不是RESTful
嚴格來說),但第二個不.. 。「刪除作業取消」?上述
d)
POST /admin/jobs/:job_id/cancel
POST /admin/jobs/:job_id/reactivate
現在的路線是有道理的,但一臉狐疑接近選項1),即使路由自身映射到REST風格的動作:所以你會改變它的東西像JobCancellationsController
而不是JobsController
中的非REST風格的操作。並且POST /admin/jobs/:job_id/reactivate
路由映射到JobCancellationsController#destroy
操作似乎非常棒。
爲了避免去年odity與JobCancellationsController#destroy
,我可以代替做:
3。與選項2類似,但創建兩個控制器:JobCancellationsController
僅限create
動作,而JobReactivationsController
僅限create
動作。
什麼是「正確」的方式來做到這一點?或者至少,哪些是我可以迅速消除的「不正確」方式?有沒有完全不同的,更好的方式,我錯過了?
謝謝。我在Ruby Australia鬆弛頻道上就此進行了很好的討論。建議與你的建議並不遙遠,但有一些額外的信息值得了解。我很快就會把它整合成一個答案。 順便說一句,是的,肯定需要重新激活。 –
幾件事。 (1)取消是錯誤的詞;稱它停用。 (2)作業取消不是資源,而是任務/動作。 (3)我認爲資源是嵌套在作業下的「活動」標誌 - 將其設置爲真或假。 – cliffordheath
是的,這是有道理的cliffordheath。那麼你會有一個JobActiveFlagsController嗎? –