Iai*_*ain 4 ruby-on-rails strong-parameters ruby-on-rails-4
我有一个字段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...
Run Code Online (Sandbox Code Playgroud)
这有效.系统管理员用户无法将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
Run Code Online (Sandbox Code Playgroud)
这使原始params对象保持原样.
没有内置的方法来做到这一点.它看起来像过去但没有更多https://github.com/rails/strong_parameters/issues/167
delete_ifHash在核心库中定义,因此它可能是在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])
Run Code Online (Sandbox Code Playgroud)
您可以指定单个值或值数组,但不会改变原始params对象
| 归档时间: |
|
| 查看次数: |
2660 次 |
| 最近记录: |