2015-09-15 38 views
0

我想實現一個關鍵的一組特定值的條件更新方法。如何基於Ruby中的選定值驗證更新?

我想只在原始list.permissions值(創建時設置)等於「公共」,「可查看或可編輯」時才允許更新如果記錄的list.permissions值不等於這三個可接受的值,更新記錄被拒絕(鎖定)

我試圖修改控制器文件中的私有方法的強烈PARAMS:

def list_params_validated 
    params.require(:list).permit(:title, permissions: ["public", "viewable", "editable"]) 
end 

,然後調用,在我的update方法相同的控制器:

def update 
    list = List.find(params[:id]) 
    if list.update(list_params_validated) 

    render json: list 

    else 
    render json: { errors: list.errors.full_messages }, status: :unprocessable_entity 
    end 
end 

沒有這個運氣,任何幫助將不勝感激!

+0

你爲什麼這樣做?我們可以validate_inclusion_of http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_inclusion_of –

+0

簡單地使用你好。我不確定是否有幫助,因爲創建記錄允許爲該權限密鑰提供多種不同的值。它只是更新我想要允許的預先存在的記錄,完全依賴於該權限密鑰中這三個值中的任何一個的存在。 – dpg5000

+0

請更新您的問題。它不包括'鎖定'權限 –

回答

1

如下所示,您可以在List型號上添加自定義驗證,並在控制器中調用簡單的update

self.permissions值應該是string"public""viewable""editable"

validate :validate_editable, :validate_permissions:on => :update 


def editable? 
    self.permissions != "locked" 
end 

private 

def validate_editable 
    errors.add(:base, "Not Ediable!") unless editable? 
end 

def validate_permissions 
    unless ["public", "viewable", "editable"].include?(self.permissions) 
     errors.add(:base, "Permission denied!") 
    end 
end 
+0

嗨謝謝,這看起來不錯,但我運行了一個列表值爲「鎖定」(不是更新的三個允許值之一)的記錄測試。然後,我在終端中使用curl成功將權限值更新爲「public」(允許的權限值之一)。即使我們嘗試將其更改爲允許的值之一,我們是否還有什麼可以將其鎖定? – dpg5000

+1

答案已被編輯,以檢查'如果鎖定',希望這會幫助你。 –

3

你可以簡單地這樣做您的控制器上

def list_params_validated 
    params.require(:list).permit(:title, :permissions) 
end 

,並在模型中只需添加本

validates_inclusion_of :permissions, in: %w(public viewable editable), :on => :update, :message => "value %s is invalid!" 

編輯1

爲了防止更新記錄,你應該在您的模型中添加before_update回調,因爲

before_update :locked? 

def locked? 
    return false if YourModel.find(id).persmissions == 'locked' 
    true 
end 
+0

謝謝!這非常接近。然而,作爲一個測試,我去了一個值不超過允許的三個值之一的值,然後對三個值中的一個進行更新並且被允許。有什麼我可以添加鎖定編輯,如果它只有這三個值之一開始? – dpg5000

+0

對不起 但我沒有得到你? 如果您不介意,請您詳細說明 –

+0

的確定!好吧,假設我有權限值設置爲「已鎖定」(而不是「公開」,「可見」或「可編輯」)的記錄。我不應該允許編輯這個記錄中的任何內容,但即使使用上面推薦的驗證,我也可以將權限值更改爲「公開」。 我無法將其更改爲「公開」,「可編輯」或「可見」之類的任何內容,但理想情況下,我不應該將其更改爲任何內容,因爲這些內容不是創建記錄的設置權限值。 – dpg5000