ruby3.2.1 更新后 Active::Record 的 params.permit 未定义方法 `=~'

use*_*264 3 ruby ruby-on-rails alpine-linux

最近我从ruby3.1.2-alpine3.15->更新ruby3.2.1-alpine3.17,我做的唯一的 gem 更新是mysql2,从0.5.30.5.5支持 openssql3。并遵循Ruby3.2.0 Breaking Changes并添加--jit --yjit标志。几乎所有应用程序都运行良好。但不知怎的,一段代码却没有。只是一个简单的params.permit

\n
permitted_params = params.permit(:category_id, :private, tags: [])\n
Run Code Online (Sandbox Code Playgroud)\n

失败的原因是

\n
NoMethodError:\n       undefined method `=~\' for #<HereGoes::MyModel>\n
Run Code Online (Sandbox Code Playgroud)\n

我的params看起来像这样:(其中“字段”只是额外的数据)。我看到的唯一奇怪的事情是嵌套的ActionController::Parameters,但同样的参数在旧的 ruby​​ 版本中解析得很好。

\n
"#<ActionController::Parameters  {\\"field_values\\"=>[#<ActionController::Parameters \n{\\"field_id\\"=>4, \\"value\\"=>\\"Test changed\\", \\"type\\"=>\\"string\\"} permitted: false>], #\n<HereGoes::MyModel id: nil, category_id: nil, uuid: \\"87ebb507-e381-4d57-b66c-10e51f10c014\\", \ncreated_at: nil, updated_at: nil, name: \\"Alphazap5\\", \\"fields\\"=> {\\"Viva11\\"=>nil,\\"Y-solowarm4 \nTextField\\"=>nil,\\"Y-solowarm4 StringField\\"=>nil,\\"Y-solowarm4 LocationsField\\"=>nil}}, \nbackup_id: 0, options: {}, tag_list: nil>=>{\\"id\\"=>1}} permitted: false>"\n
Run Code Online (Sandbox Code Playgroud)\n

如果我回到ruby3.1.2它再次工作。两个参数在执行方法时是相同ruby3.1.2的。ruby3.2.1.permit

\n

我不知道还会有什么。我没有在 ruby​​ \xe2\x80\x8b\xe2\x80\x8bor Rails 问题中找到任何与我的问题相关的内容。所以...如果有人有想法,我将不胜感激。

\n
    \n
  • 我尝试在 ruby​​ 版本之间保留相同的 gem
  • \n
  • 我比较了两个 ruby​​ 版本中的两个参数完全相同
  • \n
  • 我看到 ruby​​3.2.x 的变化可能会间接影响 ActiveRecord
  • \n
  • 我尝试禁用 --jit --yjit para
  • \n
\n

Ale*_*lex 5

Object#=~已被删除(又名Kernel#=~):
https ://rubyreferences.github.io/rubychanges/3.2.html#removals


问题在这里:
https://github.com/rails/rails/blob/v7.0.4.2/actionpack/lib/action_controller/metal/strong_parameters.rb#L1069

next unless key =~ /\(\d+[if]?\)\z/
Run Code Online (Sandbox Code Playgroud)

你有HereGoes::MyModel以下关键params

{ "field_values" => [...], #<HereGoes::MyModel...> => {"id"=>1} }
Run Code Online (Sandbox Code Playgroud)

这以前从未被允许,因为Object#=~只是返回,这就是删除nil的原因:

# v3.1.2
>> ActionController::Parameters.new({field_values: [], Class.new => {id: 1}}).permit(:id, field_values: [])
=> #<ActionController::Parameters {"field_values"=>[]} permitted: true>

# v3.2.1
>> ActionController::Parameters.new({field_values: [], Class.new => {id: 1}}).permit(:id, field_values: [])
/home/alex/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4.2/lib/action_controller/metal/strong_parameters.rb:1069:in `block in permitted_scalar_filter':
undefined method `=~' for #<Class:0x00007fd63c224380> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

您必须在其他地方做其他事情才能使其发挥作用。

您的模型不应该真正位于 中params,如果您需要帮助,则必须共享一些代码。