【问题标题】:Rails method global params kind_in error when upgraded升级时Rails方法全局参数kind_in错误
【发布时间】:2021-07-16 08:53:01
【问题描述】:

我最近完成了 rails 和 ruby​​ 升级,我们在应用程序中没有强大的参数(我知道这是遗留问题)。

所以它在应用程序中的完成方式如下

def all_params_permitted(this_params = nil)
  this_params = params if this_params == nil
  this_params.permit!

  this_params.each do |i, v|
    if v.kind_in?([Hash, ActionController::Parameters])
      all_params_permitted(v)
    end
  end
end

它遍历所有参数并只接受所有内容,all_params_permitted 在整个应用程序中被调用我很想添加强大的参数,但现在不行。

上述方法中的问题是kind_in? 我为这个应用程序所做的升级是rails 5.0.3rails 6.1+ 并从ruby 2.2.6ruby 3.0.1 所以我不知道为什么kind_in? 已经停止在职的。这是一个旧应用程序(内置 rails 2),所以不确定它是否已被弃用。

这里的任何帮助都会很棒。

编辑

我试过kind_of?,但没有骰子。

【问题讨论】:

  • "kind_in error when upgrade" – 当请求帮助解决错误时,请包括错误消息和堆栈跟踪的所有相关部分。
  • 我还想指出,这种方法会导致“安全漏洞”!!...如果您曾经在代码中执行过 user.update(params) 之类的操作,您可能容易受到提权的影响.
  • 是的,我知道 Tom,这就是为什么我想用强大的参数替换它。但是添加强大的参数将是“代码更改太大”,因此修复我们所拥有的问题,因为我很困惑哈哈。事实证明,我们在应用程序中有大量自定义代码以及扩展的 ruby​​(不是开玩笑),包括添加了一个 yes a 'kind_in' 方法,这就是为什么没有参考,因为它是完全自定义的,我们有很多这样的事情,我我创建这个问题时没有意识到这一点哈哈。

标签: ruby-on-rails ruby legacy


【解决方案1】:

我为这个应用程序所做的升级是 rails 5.0.3 到 rails 6.1+,然后从 ruby​​ 2.2.6 升级到 ruby​​ 3.0.1

这是自找麻烦。 It is strongly advised to try upgrading one minor version at a time(例如 rails 5.0 --> 5.1 --> 5.2 --> 6.0 --> 6.1),否则你很可能会在没有关于它为什么停止工作/如何修复它的信息的情况下破坏事情。

对于 ruby​​ 版本也是如此...绝对最低我会推迟到 ruby​​ v3 的最终升级,直到您的应用程序在 ruby​​ 2.7 下正常工作。

我不确定为什么 kind_in? 停止工作

我也不是,因为那是一种自定义方法。你没有向我们展示它是如何定义的,也没有向我们展示错误信息,所以我无法自信地说出了什么问题。

我的猜测是这样实现的:

class Object
  def kind_in?(classes)
    classes.any? { |c| self.kind_of?(c) }
  end  
end 

即这是the built-in kind_of? method 的一个小包装。

话虽如此,我仍然不知道为什么这会由于 ruby​​ 和/或 rails 升级而“停止工作”。

【讨论】:

    【解决方案2】:

    不确定kind_in?,也没有找到对该方法的任何引用,因为您还没有发布错误,所以不确定您的问题。 is_a?kind_of?instance_of? 是少数检查对象类的方法,但它们只检查一个类。查看您的代码,适合您的情况的一个选项可能是:

    if [Hash, ActionController::Parameters].include?(v.class)
    

    它将检查它是否属于这些类之一。

    【讨论】:

    • 请注意,您的示例严格检查这些类的实例。对于 ActiveSupport 的 HashWithIndifferentAccess 等子类的实例,它将返回 false
    • @Stefan 是的,但实际上这是 op 的代码,我刚刚将其更改为适用于他的情况
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多