【问题标题】:YAML output from rails consoleRails 控制台的 YAML 输出
【发布时间】:2012-04-20 11:49:04
【问题描述】:

在rails 控制台中执行y Grau.all 之类的命令时,我得到这些奇怪的!binary 字符串而不是属性名称。知道如何解决这个问题吗?

谢谢。

irb(main):003:0> y Grau.all
  ←[1m←[36mGrau Load (0.0ms)←[0m  ←[1mSELECT "graus".* FROM "gr
  ←[1m←[35mEXPLAIN (0.0ms)←[0m  EXPLAIN QUERY PLAN SELECT "grau

EXPLAIN for: SELECT "graus".* FROM "graus"
0|0|0|SCAN TABLE graus (~1000000 rows)

---
- !ruby/object:Grau
  attributes:
    !binary "aWQ=": 27
    !binary "bm9tZQ==": 1 Grau
    !binary "Y3JlYXRlZF9hdA==": 2012-04-06 21:24:34.553163000 Z
    !binary "dXBkYXRlZF9hdA==": 2012-04-06 21:24:34.553163000 Z
- !ruby/object:Grau
  attributes:
    !binary "aWQ=": 28
    !binary "bm9tZQ==": 2 Grau
    !binary "Y3JlYXRlZF9hdA==": 2012-04-06 21:24:34.599963000 Z
    !binary "dXBkYXRlZF9hdA==": 2012-04-06 21:24:34.599963000 Z

[更新]

irb(main):001:0> Grau.find(1)
  ←[1m←[36mGrau Load (43.8ms)←[0m  ←[1mSELECT "graus".* FROM "graus" WHERE "grau
s"."id" = ? LIMIT 1←[0m  [["id", 1]]
=> #<Grau id: 1, nome: "1º Grau", created_at: "2012-04-11 15:51:32", updated_at:
 "2012-04-11 15:51:32">
irb(main):002:0>

我在 Windows 7 64 位上使用 Rails 3.2.3、Ruby 1.9.3。

【问题讨论】:

  • 你能举一个只有一个Grau对象的例子吗? Grau.find(1)(或任何其他有效 ID)的控制台中的输出是什么?它也是二进制的吗?你使用的是什么版本的 ruby​​ 和 rails?
  • 根据要求更新了问题。请看一下。谢谢。

标签: ruby-on-rails ruby console yaml


【解决方案1】:

这似乎是因为 Rails 默认使用较新的 psych YAML 引擎,较旧的 syck yaml 引擎不输出 !binary 键。如果您只是希望它在控制台中进行测试,您可以切换回旧的 yaml 引擎作为临时解决方法:

 > y User.first
  User Load (0.0ms)  SELECT "users".* FROM "users" LIMIT 1
--- !ruby/object:User
attributes:
  !binary "aWQ=": 1
  !binary "bmFtZQ==": Example User
  !binary "ZW1haWw=": user@example.com

 > YAML::ENGINE.yamler= 'syck'
=> "syck"

 > y User.first
  User Load (1.0ms)  SELECT "users".* FROM "users" LIMIT 1
--- !ruby/object:User
attributes:
  id: 1
  name: Example User
  email: user@example.com

您只需要在您的 ActiveRecord 列名/属性键使用Encoding::ASCII_8BIT 编码时才需要这样做,我认为这只会发生在 SQLite 中。


更新:

自发布此答案以来,SQLite3 gem 已修复为return utf8 for column names。确保您使用的是 sqlite3 gem 的 1.3.6 版(或更高版本)。然后默认/较新的 psych yaml 引擎(也支持人类可读的 unicode 输出)将毫无问题地工作:

 > y User.first
  User Load (0.0ms)  SELECT "users".* FROM "users" LIMIT 1
  EXPLAIN (0.0ms)  EXPLAIN QUERY PLAN SELECT "users".* FROM "users" LIMIT 1
EXPLAIN for: SELECT  "users".* FROM "users"  LIMIT 1
0|0|0|SCAN TABLE users (~1000000 rows)

--- !ruby/object:User
attributes:
  id: 1
  name: irmão
  email: user@example.com

【讨论】:

  • 感谢您的回答。有用!无论如何运行该命令来自动更改 yaml 引擎或我可以更改的任何配置文件,这样我就不必每次都手动执行此操作?谢谢。
  • 您只是想在 Rails 控制台中使用它吗?如果是这样,您可以将YAML::ENGINE.yamler = 'syck' if defined?(Rails::Console) 放入您的development.rb
  • 这样就行了。但是,现在,我得到了我认为是一些特殊字符的 unicode 表示形式,例如 irm\xC3\xA3o 而不是 irmão。在像我这样的语言葡萄牙语中,能够在控制台上看到这些字符非常重要。知道如何解决这个问题吗?谢谢。
【解决方案2】:

在我的一个页面上显示我的调试(参数)时遇到了同样的问题。这让我很沮丧。我可能走了很长一段路,但我一直在使用 sqlite3,并且知道我将在生产中使用 Postgres,我继续在本地配置 Postgres 数据库(有点让人头疼)。 另一件事可能是在我添加的 database.yml 文件中 编码:unicode

如果您有时间和耐心,最好在测试中使用与生产中相同的数据库。

【讨论】:

    【解决方案3】:

    我不确定 irb,但请在 Rails 应用程序根目录中尝试 rails console(这将正确加载所有活动记录对象)

    在 Rails 2.x 中

    <your rails app> ruby script/console
    

    在 Rails 3.x 中

    <your rails app> rails c
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多