2011-07-22 21 views
0

我想保持我的控制器很好的RESTful。我不斷遇到的一個問題是需要網站上的按鈕或鏈接來觸發模型上的特定事件。例如:我應該如何處理通過REST控制器觸發「操作方法」?

@ user.ban!

目前,我要麼在用戶控制器上創建一個自定義的命名路由,要麼它是一組更復雜的相關操作,我創建一個新的控制器,與另一個「傳統命名的」控制器作用於同一模型。

在這種情況下最好的方法是什麼?哪些因素影響決策?

回答

1

在你的路線,你會通常有一個資源的聲明看起來像這樣

resources :users 

什麼要補充的一個REST類型的路線,這是定義在用戶控制器的禁令方法和添加成員路線的最好方法給用戶的路線,以便您的路線最終使用button_to或的form_for(加上其他)視圖助手時,看起來像這樣

resources :users do 
    member do 
    post :ban, :pay, :whatever 
    end 
end 

使用形式發表memeber航線投入行動,即。 GET請求使用集合(即鏈接)

另外,您可以使用<%= button_to「禁令」,@user%>然後在用戶控制器更新操作檢查提交PARAMS文本禁令,並採取相應的行動 其實我偶爾會這樣使用

if params[:commit] == 'Ban' 
# do something like calling a ban method setting a flash notice or alert and redirecting 
    else 
    normal controller flow 
    end 

更好。使用i18n在按鈕上顯示文本並檢查相同的i18n值與提交參數,從而使您可以自由更改i18n yml文件而不會損壞按鈕上的文本文本而不會破壞您的控制器代碼

+0

我應該還補充說,上述會給你ban_user_path,在你的意見,控制器,助手等使用pay_user_path和whatever_user_path方法...所以你會使用禁令按鈕這樣的'<%= button_to「潘基用戶',ban_user_path(@user)%>'這就是我認爲你正在尋找 – jamesc

+0

這就是我目前所做的。問題在於一個複雜的應用程序中有很多操作和觸發器,我發現控制器的路線很重。 – chrishomer

+0

我想這是寫一個大的應用程序懲罰笑:) – jamesc

0

首先,詹姆斯說是好的。有很多的細節在這裏...

http://guides.rubyonrails.org/routing.html#non-resourceful-routes http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

...我實際上對於去我需要什麼非常規的路線。關於「因素權衡這個決定,」不過......我會先問自己,如果是絕對需要這種古怪的動作,因爲往往不是Rails的‘約定優於配置’的政策切入點。從以往的經驗,我發現,我非常需要非典型行動。我想,如果你能證明這一點,但不要感到內疚並且不去理會它。

我很少以往任何時候都不得不做出一個整體「諾特爾控制器,雖然。

相關問題