2013-04-26 76 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