gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:50:25 25 4
gpt4 key购买 nike

我有一个字段 otp_set_up ,其中在 company_user 模型被允许为“真”或“假”。

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

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

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

在 params.require .permit 位之前,我在特定于 Controller 中更新的 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 中执行此操作的最佳和正确方法吗?对我来说似乎有点 hacky,通过 params 哈希并删除一点。

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

最佳答案

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_ifHash 上定义在核心库中,因此在没有内置方法的情况下,它可能是在 Ruby 中执行此操作的最佳方法,并且在 Rails 中进行扩展。

更新

我认为这是一个有趣的想法,所以我写了一个名为 allowable 的小 gem 。对于这种类型的用例。它将添加一些方法到 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目的

关于ruby-on-rails - 通过 Rails 4 中的强参数只允许某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com