【问题标题】:How to check parameter type in rails?如何检查rails中的参数类型?
【发布时间】:2023-03-17 13:17:01
【问题描述】:

也许我在验证上太过分了,但我想确保当我收到一个 POST 请求时,它包含特定的特定值(可以通过 params.require() 完成),并且这些值是特定的类型:哈希、数组、字符串。 TBH,我什至不确定可以通过 POST 请求传输的所有类型。问题是,使用 .is_a 时,对象显示为 ActionController::Parameters 类型?如果在 Rails 中有更好的方法,请告诉我。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    Rails(或更准确地说是 Rack)可以从通过name 属性创建的参数中解析出数组和哈希值。

    例如:

    # simple hash
    user[email]="test@example.com"
    
    # nested hash
    user[address][street]="Easy Street 21" 
    
    # an array with 3 elements
    user[some_arrray_param][]="1" 
    user[some_arrray_param][]="2" 
    user[some_arrray_param][]="3" 
    

    当您从带有.require 或.fetch 的参数中获取包含“散列”的键时,它们实际上会返回一个ActionController::Parameters 实例,该实例是一个类似于散列的对象,但具有Rails 强参数接口等等。

    .require() 只是获取一个哈希键,如果它不存在则引发异常。

    您尝试做的实际上是应该通过验证在模型级别处理的事情,而不是让您的控制器变胖。

    【讨论】:

    • 谢谢。我的模型已经很胖了,这将是一个特殊的助手。真的,我想在它到达具有无效类型、缺少参数等的模型之前停止执行。其他属性,如长度、允许的值和 Presence_required 应该放在模型中。不过,我正在寻找一种调用 is_a 的方法?关于参数哈希值。
    • 改用鸭子打字。
    • 鸭子打字可能是这里的方式。在这种特殊情况下,由于框架的设计,我正在诉诸于此,但我知道鸭子类型是一种非常标准的方法......为什么你会在 is_a 上使用鸭子类型?(哈希)或 object.class= = 哈希?我知道您可能只需要运行一个特定的方法,该方法可能对几个不同的对象有效,但这似乎很危险,可能会得到您意想不到的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多