【问题标题】:How to require an Array in Rails when using strong parameters?使用强参数时如何在 Rails 中要求数组?
【发布时间】:2014-01-29 00:38:12
【问题描述】:
在 Rails 4 中使用强参数时,有没有办法require 数组?
> params = ActionController::Parameters.new(contacts: [])
=> {"contacts"=>[]}
> params.require(:contacts)
ActionController::ParameterMissing: param not found: contacts
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-4
strong-parameters
【解决方案1】:
你试过了吗
params.permit(contacts: []).require(:contacts)
【解决方案2】:
正如 Steve Wilhelm 所说,如果数组不为空,它就可以工作。它仅在您的示例中失败,因为联系人数组为空。但这通常是期望的行为。
如果您不关心数组中的内容,只需使用 permit。
也就是说,我想最常见的情况是您想要一个具有已知键的哈希数组。我会这样做:
# Returns an array of contacts after checking the params shape
# Use instead of params[:contacts]
def contacts_params
params.permit(contacts: %i(id name phone address))
params.require(:contacts)
end
【解决方案3】:
看来您可以拥有标量数组,这可行
> params = ActionController::Parameters.new(contacts: [nil])
=> {"contacts"=>[nil]}
> params.require(:contacts)
=> [nil]
> params = ActionController::Parameters.new(contacts: [1])
=> {"contacts"=>[1]}
> params.require(:contacts)
=> [1]
这是来自documentation的描述
允许的标量类型有 String、Symbol、NilClass、Numeric、TrueClass、FalseClass、Date、Time、DateTime、StringIO、IO、ActionDispatch::Http::UploadedFile 和 Rack::Test::UploadedFile。
要声明 params 中的值必须是允许的标量值数组,请将键映射到一个空数组:
params.permit(id: [])