通过Rails 4中的强大参数仅允许某些值

伊恩

我有一个字段otp_set_up,在company_user模型中允许该字段为“ true”或“ false”。

在一个用例中,系统管理员用户可以将此字段重置为“ false”。

虽然可以通过代码将字段设置为“ true”,但没有用户可以通过表单编辑等将其设置为“ true”。

我没有在模型中添加验证,因为它可以是“ true”或“ false”。

我在params.require .permit位之前的控制器中特定于更新的params方法中具有以下代码:

if curr_company_user.is_sys_admin? && curr_company_user.can_crud_company_users? && params[:id].to_i != curr_company_user.id

  params[:company_user] = params[:company_user].except(:otp_set_up) if params[:company_user][:otp_set_up] == true
  params.require(:company_user).permit(:otp_setup, etc. etc....

elsif etc. etc...

这有效。Sys管理员用户不能将otp_set_up设置为“ true”。

我的问题是:

这是在Rails中执行此操作的最佳和正确方法吗?在我看来,通过params hash并删除了一些内容有点hacky。

有没有更好/更清洁的方法?

西蒙·伯格

delete_if清理它。还是有点骇人听闻,但稍微少了点:)

params.require(:company_user).permit(:otp_setup).delete_if do |key, val|
  key == 'otp_setup' && val == true
end

这使原始params对象保持不变。

没有内置的方法可以做到这一点。看起来曾经有过,但现在没有更多了https://github.com/rails/strong_parameters/issues/167

delete_ifHash在核心库中定义的,因此它可能是在Ruby中进行扩展的最佳方法,并且在没有内置方法的情况下通过Rails进行扩展。

更新资料

我认为这是一个有趣的想法,所以我写了一个小宝石,称为这种情况下的允许它会添加一些方法HashActionController::Parameters#allow#allow!#forbid#forbid!

你会这样使用

params.require(:company_user).permit(:otp_setup).forbid(otp_setup: [true])

# or

params.require(:company_user).permit(:otp_setup).allow(otp_setup: [false])

您可以指定一个值或值数组,并且它不会突变原始params对象

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章