【问题标题】:Ruby - LoadError enc/trans/single_byteRuby - LoadError enc/trans/single_byte
【发布时间】:2012-11-07 20:33:19
【问题描述】:

在我的 Ruby on Rails 应用程序中使用 ActiveRecord::Store 模块时遇到了一个奇怪的问题。据我了解,此模块在后台使用“序列化”方法,因此它只需使用 ruby​​ 内置的 psych gem 将您的数据序列化为 yaml 格式。

它大部分时间都可以正常工作,但有时我会收到 500 错误并显示以下消息:

LoadError (cannot load such file -- enc/trans/single_byte):
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:27:in `write'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:27:in `end_document'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:27:in `visit_Psych_Nodes_Document'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:20:in `block in visit_Psych_Nodes_Stream'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:20:in `each'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/emitter.rb:20:in `visit_Psych_Nodes_Stream'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych/nodes/node.rb:46:in `yaml'
~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/psych.rb:243:in `dump'

如您所见,我使用 rbenv 和 ruby​​ 1.9.3-p286。我的系统是 Ubuntu 11.10。所需文件存在~/.rbenv/versions/1.9.3-p286/lib/ruby/1.9.1/i686-linux/enc/trans/single_byte.so。我在使用 ruby​​ 1.9.3-p194 时遇到了同样的错误。而这个问题最奇怪的地方就是这个错误时有发生。

所以也许有人也遇到了这个问题并且已经找到了解决方案?还是它看起来更像是 psych 中的一个错误,我应该将它提交给它的维护者?

提前感谢您的帮助!

编辑:问题与心理宝石没有直接关系。这是不寻常的红宝石设置的一般问题。有关详细信息,请参阅下面接受的答案。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord psych


    【解决方案1】:

    这是否发生在您的开发环境的舒适范围内?如果是这样,我会考虑在pry-rescuePry.rescue do … end 块下运行它并在那里四处寻找。

    我怀疑存在数据差异。这棵树中是否有意涉及任何非ASCII?你可以用这样的东西来追捕它:

    ruby -e 'Dir["**/*.yml"].each{|e| File.read(e)[/[^\x0-\x7f]/] and puts e}' 
    

    如下所示,rbenv 安装是与其他用户共享的,因此请务必在任何更改时重做权限:

     chmod a+r -R ~/.rbenv/
    

    或者也许创建一个共享组,例如src,然后:

     chgrp src ~/.rbenv && chmod g+r -R ~/.rbenv
    

    【讨论】:

    • rking,感谢您的建议!你给我指出了正确的方向。解决了。问题很简单:我在源代码中使用了非 ASCII 字符,所以我必须在 ruby​​ 解释器中打开 unicode 模式(通过魔法 cmets)。但是由于不寻常的设置(安装 ruby​​ 的主目录已关闭,其他用户无法访问),ruby 无法使用其内部内容对我的代码进行转码。解决方案:至少向启动 ruby​​ 解释器的用户打开安装 ruby​​ 的目录。 rking,您能否使用此信息完成您的答案,以便我接受它作为最终解决方案?我希望它可以帮助某人。
    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多