2013-04-26 62 views
5

是否可以根據需要使用強參數標記散列的單個屬性?需要屬性的強參數

給定的輸入,如:

{ 
    "example" => { 
    "optional": 1234, 
    "required": 5678 
    } 
} 

標準強PARAMS的例子是:

params.require(:example).permit(:optional, :required)

既然你可以要求某些參數,我想下面將工作:

params.require(:example).require(:required) 
params.require(:example).permit(:optional) 

我試過:

params.require(:example => [ :required ]).permit(:optional) 
params.require(:example).permit(:optional) 
params[:example].require(:required) 

還有其他我能想到的。

有沒有人知道它是否可能?

回答

5

Greg!

我有同樣的問題,但畢竟我發現,它不適合的問題。

看,這是需要方法strong_parameters寶石的源代碼:

def require(key) 
    self[key].presence || raise(ActionController::ParameterMissing.new(key)) 
end 

所以,基本上,沒有辦法要求在PARAMS哈希「必需的」屬性。但從不同側面看它。我認爲最好寫下你自己的需求方法來做到這一點。由於我正在使用導軌,因此我只是將validates_presence_of添加到模型中。如果您想使其變爲動態,您可以創建自定義驗證。你可以在這裏找到它的文檔:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#performing-custom-validations

+0

感謝RunFor。我得出了同樣的結論。在我的情況下,存在需求取決於資源訪問的方式(即通過控制器),但我已經能夠進行一些有條件的驗證來幫助解決這個問題。 – 2013-05-06 19:21:59

0

你可以做的是使用

def example_params 
    params.require(:example) 
    params[:example].require(:required) 
    params.require(:example).permit(:required, :optional) 
end 

如果:example丟失第一行失敗。如果:required:example中丟失,則第二行失敗。第三行返回你期望的內容,同時允許:optional