gpt4 book ai didi

ruby-on-rails - 无法在不支持编码的对象上设置编码

转载 作者:行者123 更新时间:2023-12-04 15:44:12 26 4
gpt4 key购买 nike

已从云 9 迁移到 AWS 云 9。现在我在 GET 上收到错误...

在网上搜索了一些关于 postgresql 将 template1 更改为 template0 等的信息,但没有成功。

在 2019-06-13 19:52:07 +0000 开始获取 167.102.190.106 的“/”

ArgumentError (cannot set encoding on non-encoding capable object)

Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-4.2.11.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.4ms)
Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-4.2.11.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (0.7ms)
Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-4.2.11.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.7ms)
Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-4.2.11.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (12.0ms)


Process exited with code: 0
[2019-06-13 19:52:44] INFO going to shutdown ...

Pane 已死

最佳答案

简短的回答:

更改为不同的 Ruby 版本并重新安装该版本的 gem。

Ruby 2.4.7 和 Rails 4.2.11.1 对我有用,我唯一需要更改的其他 gem 版本是 bundler(从 2.0.2 到 1.17.3)

长答案:

在对 Ubuntu、Ruby、Rails 和我的项目 gemset 进行一系列版本升级后,我发现了同样的错误。有效的步骤(注意:您的确切版本可能会有所不同,具体取决于您的项目 gems。转到 https://rubygems.org/ 并找到符合您需要的最新稳定版本/子版本,如运行 bundle install< 时的任何警告所概述)

切换到 Ruby 2.4.7

rvm install 2.4.7
rvm --default use 2.4.7 #use Ruby 2.4.7 and set it as the default

卸载 bundler (更改 Ruby 版本后运行 bundle install,它将显示需要 <2.0 的 bundler )

gem uninstall bundler 

如果出现提示,您可能还需要卸载全局安装的 bundler ,例如

gem uninstall -i /usr/local/rvm/gems/ruby-2.4.7@global bundler

安装兼容的 bundler 版本并运行它。如果您还有任何冲突,请使用 https://rubygems.org/ 调整 Gemfile 中的版本。作为指南。

gem install bundler -v 1.17.3
bundle install

我有与您相同的 Ruby/Rails 配对 - 2.6.3/4.2.11.1,并收到相同的错误消息。不会生成任何跟踪,因此很难使用现成编译的 Ruby 库进行调试。

在寻求帮助时,我在这里遇到了一个关于另一个 gem iconv(我的项目中没有)的错误报告:https://github.com/ruby/iconv/issues/15开发人员注意到他们的 gem 在特定 Ruby 版本下使用时开始抛出该错误:

Works in ruby 2.6.0 preview1 and 2, does not in preview3 and greater, so the commit is between preview2 and preview3

以此为指导,我回到了最后一个稳定的 Ruby 次要版本 2.4.7

在版本变化之前,我也发现我系统中设置的location是空的,所以我设置了LANG=en_CA.utf8,但是没有效果。

其他尝试:

我在我的项目文件中搜索并没有找到字符串“无法在不支持编码的对象上设置编码”,这意味着错误是从 Ruby 核心文件或全局安装的 gem 中抛出的。所以我搜索:

grep -iRl "cannot set encoding on non-encoding capable object" /usr

并如预期的那样取回了一组 Ruby 核心文件。不过它们是经过编译的,所以我从 https://github.com/ruby/ruby 下载了 Ruby 源文件。并搜索了源代码。

错误是在encoding.c中的一个函数中抛出的:

enc_set_index(VALUE obj, int idx)
{
if (!enc_capable(obj)) {
rb_raise(rb_eArgError, "cannot set encoding on non-encoding capable object");
}

if (idx < ENCODING_INLINE_MAX) {
ENCODING_SET_INLINED(obj, idx);
return;
}
ENCODING_SET_INLINED(obj, ENCODING_INLINE_MAX);
rb_ivar_set(obj, rb_id_encoding(), INT2NUM(idx));
}

基于 encoding.c 中其他地方的对象类型测试

static inline int
enc_capable(VALUE obj)
{
if (SPECIAL_CONST_P(obj)) return SYMBOL_P(obj);
switch (BUILTIN_TYPE(obj)) {
case T_STRING:
case T_REGEXP:
case T_FILE:
case T_SYMBOL:
return TRUE;
case T_DATA:
if (is_data_encoding(obj)) return TRUE;
default:
return FALSE;
}
}

如果您想完全诊断问题,您可以跟踪 Ruby 源代码中的调用和定义以查看发生了什么,和/或在 enc_set_index 中添加自定义回溯日志记录调用函数,编译这个自定义版本的 Ruby,并为您的项目安装它以给出更充实的错误消息。但是……你呢?

结论:

Ruby、Rails 和某些 gem 的某些不兼容版本导致了该错误。寻找确切的 gem 是不值得的——更改 Ruby 版本本身要容易得多。前面提到的 iconv gem 使用更新版本 (iconv-1.0.6) 修复了错误,并且大概在我继续 gem 和系统版本更新时我会发现更高 -不会抛出错误的版本组合。

关于ruby-on-rails - 无法在不支持编码的对象上设置编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587786/

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