2012-08-24 62 views
0

我有一個使用腳手架生成器創建的ProTip模型。除indexshow之外的所有操作都要求您成爲管理員。如何從兩個不同的控制器創建模型

我想允許用戶提交自己的ProTip s,但將其存儲在隊列中,直到有人有機會批准它們。

我能想到的幾種方法可以做到這一點:

  1. 創建具有相同的字段ProTip一個UserSubmittedProTip一個完全不同的模式。使用index,newcreate動作創建一個新的UserSubmittedProTipController。在create操作中,我可以創建一個新的ProTip,並在保存到數據庫之前將UserSubmittedProTip中的屬性複製到它。我可以要求管理員執行index操作,並可以使用它來執行審批。

  2. 創建一個新的SubmitController只有newcreate的操作。創建一個視圖,該視圖共享部分ProTip_form,但知道要提交哪個控制器。在create操作中,我可以在保存之前將ProTip.approved設置爲false。那麼我將不得不建立一個審批機制。

第一種方法似乎是最簡單的,因爲我不知道如何實現第二種方法。兩種方法都覺得有點笨拙,我想知道這種問題的最佳做法是什麼。

這是解決這個問題的唯一方法嗎? 如果沒有,更聰明的是什麼?否則,這更接近最佳實踐,還是他們明顯錯誤?

回答

1

我不會推薦第一個解決方案。

在您的情況下,如果您不想真正使用兩個控制器,則沒有任何理由。

如果當前用戶是管理員,則可以簡單地創建對象。

如果當前用戶不是管理員,則創建該對象,但設置該項目需要審批的布爾值,或者執行相反操作....在您是管理員時設置「已批准」標誌。

當管理員查看列表操作時,可以顯示額外的「批准」列。

def create 
    @protip = Protip.new(params[:protip] 
    # I'm assuming you have logic to determine if the user is an admin. 
    # I usually encapsulate that in a method on the user model. So 
    # my code would look like this: 
    @protip.approved = true if current_user.is_an_admin 
    if @protip.save 
    ... do your normal stuff 


end 

確保您有一個範圍的批准protips

scope :approved, where(:approved => true) 

而且總是顯示那些。

@protips = Protip.approved 

如果你確實想保持它們分開,你當然可以重複使用partials。當您進行渲染調用時,您可以指定從哪裏獲取部分。

render "/protips/_form" 

這是怎麼開始的?

+0

完美。感謝您的詳細回覆。有時候,我需要退後一步,意識到有一種更簡單的方法,因爲通常情況下是這樣。 –

相關問題