加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 通过Rails 4中的强参数仅允许某些值

发布时间:2020-12-17 02:49:51 所属栏目:百科 来源:网络整理
导读:我有一个字段otp_set_up,在company_user模型中允许为“true”或“false”. 有一个用例,sys管理员用户可以将此字段重置为“false”. 虽然可以通过代码将字段设置为“true”,但是用户可以通过表单编辑等将其设置为“true”. 我没有在模型中添加验证,因为它可以
我有一个字段otp_set_up,在company_user模型中允许为“true”或“false”.

有一个用例,sys管理员用户可以将此字段重置为“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...

这有效.系统管理员用户无法将otp_set_up设置为“true”.

我的问题是:

这是在Rails中执行此操作的最佳和正确方法吗?对我来说这似乎有些笨拙,通过params hash并删除一点.

有更好/更清洁的方式吗?

解决方法

delete_if清理它.仍然有点hacky,但稍微不那么:)

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_if是在核心库中的Hash上定义的,因此在缺少内置方法的情况下,它可能是在Ruby中以及在Rails中扩展的最佳方式.

更新

我认为这是一个有趣的想法,所以我为这种用例写了一个名为allowable的小宝石.它将为Hash和ActionController :: 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对象

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读