NoMethodError (undefined method `scan' for {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant. You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with. The current date and time is %{current_date_time}. Only respond to the last question, using the prior information as context, if appropriate."}:Hash)
lib/i18n/i18n_interpolation_keys_finder.rb:6:in `find'
app/controllers/admin/site_texts_controller.rb:183:in `record_for'
app/controllers/admin/site_texts_controller.rb:249:in `block in find_translations'
app/controllers/admin/site_texts_controller.rb:234:in `each'
app/controllers/admin/site_texts_controller.rb:234:in `find_translations'
app/controllers/admin/site_texts_controller.rb:34:in `index'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'
es scheint, dass die betreffende Methode Text erwartet:
aber irgendwie einen Hash erhält:
irb(main):001:0> item = {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant. You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with. The current date and time is %{current_date_time}. Only respond to the last question, using the prior information as context, if appropriate."}
=>
{:basic=>"You are a helpful assistant.",
irb(main):002:0> item
=>
{:basic=>"You are a helpful assistant.",
:agent=>
"You are a helpful assistant. You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with. The current date and time is %{current_date_time}. Only respond to the last question, using the prior information as context, if appropriate."}
irb(main):003:0> item.scan
(irb):3:in `<main>': undefined method `scan' for {:basic=>"You are a helpful assistant.", :agent=>"You are a helpful assistant. You have great tools in the form of functions that give you the power to get newer information. Only use the functions you have been provided with. The current date and time is %{current_date_time}. Only respond to the last question, using the prior information as context, if appropriate."}:Hash (NoMethodError)
from /home/robert/.rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
from /home/robert/.rbenv/versions/3.2.1/bin/irb:25:in `load'
from /home/robert/.rbenv/versions/3.2.1/bin/irb:25:in `<main>'
irb(main):004:0
was dazu führt, dass es abstürzt … Ich werde die Untersuchung fortsetzen
Ich glaube, es wird von hier aufgerufen:
Ich kann das Problem mit Folgendem reproduzieren:
I18nInterpolationKeysFinder.find(I18n.overrides_disabled { I18n.t("chatbot.prompt.system.", locale: :en) })
aus der Rails-Konsole.
Ich glaube, diese Zeile soll verhindern, dass die Methode einen Hash erhält, aber sie funktioniert nicht, warum?:
Ich verschiebe dies nach Contribute > Bug, da ich der Meinung bin, dass dieses Verhalten falsch und aus irgendeinem Grund unzuverlässig ist.
Laut dem Code sollte der Wert, wenn es sich um einen Hash handelt, nicht an die Methode record_for gesendet werden (wo er eine Ausnahme auslösen würde, da diese Text erwartet), aber in einigen Fällen geschieht dies doch.
Dies geschieht, wenn es eine Übersetzung-Überschreibung für einen Schlüssel gibt, der zuvor eine übersetzbare Zeichenfolge war, aber später in einen Hash konvertiert wurde. Genau das ist mit chatbot.prompt.system passiert.
Dies scheint ein Rückschritt zu sein. Ich bin ziemlich sicher, dass dies in der Vergangenheit funktioniert hat.
Ich kann dies leicht mit einer Locale-Datei wie dieser reproduzieren:
en:
foo: "this is foo"
Gehen Sie zu Anpassen → Text und überschreiben Sie “foo” mit einem anderen Wert.