我有以下字符串:

s = "[:test1, :test2]"

我希望它再次以符号数组的形式结束:

[:test1, :test2]

我发现了两个类似的问题:

Ruby: Parsing a string representation of nested arrays into an Array?

Ruby convert string array to array object

但JSON.parse和YAML.Load都不起作用:

irb(main):043> test
=> "[:test1, :test2]"
irb(main):044> JSON.parse test
/Users/[...]/.rbenv/versions/3.2.2/lib/ruby/3.2.0/json/common.rb:216:in `parse':
unexpected token at ':test1, :test2]' (JSON::ParserError)
irb(main):045>
irb(main):045> YAML.load test
/Users/[...]/.rbenv/versions/3.2.2/gemsets/rails_test/gems/psych-5.1.1.1/lib/psych/parser.rb:62:in `_native_parse': (<unknown>):
did not find expected node content while parsing a flow node at line 1 column 2 (Psych::SyntaxError)

eval确实有效,但出于注入方面的考虑,通常不推荐使用.

irb(main):047> eval(test)
=> [:test1, :test2]

我能找到的唯一方法是一些基本的字符串操作,但我想知道是否有更好的方法内置到Ruby中,而不涉及创建自定义函数.

irb(main):046> test.delete("[]:").split(", ").map(&:to_sym)
=> [:test1, :test2]

Ruby 3.2.2以供参考.

推荐答案

您可以清理您的示例,但不能保证它在任何不是存储在字符串中的符号平面数组的情况下都有效.

s = "[:test1, :test2]"

s = s.delete(":[]").split(?,).map { _1.strip.to_sym }
=> [:test1, :test2]

然而,完全不清楚您将如何得到一个字符串而不是符号数组,并且Rails指南中关于composite keys的任何内容都没有解释您是如何处于这种状态的.我不得不假设您是从表单输入或URI参数(两者都表示为字符串)获取数据,而不是将元素解析为separate个列名,这样您就可以从两个字符串值正确地形成组合键.

关于composite keys in forms的部分说,键必须用下划线分隔,才能使Rails魔术发挥作用,而且您可能还需要在控制器中实现params.extract_value才能正确访问它们.您没有显示任何控制器、视图或模型代码,因此您似乎是在试图修补格式不正确的最终结果,而不是关注错误数据的来源.

即使事实并非如此,这最终也解决了错误的问题.你需要弄清楚为什么s包含无效的JSON,或者为什么你没有得到两个单独的键作为String对象(而不是Symbols),然后你可以使用它们来正确地形成你的复合键.

解决这些问题.事后的串通只是治标不治本.

Ruby-on-rails相关问答推荐

Rails Heroku部署:预编译assets资源 失败.SassC::语法错误

是否从已转换为字符串的数组中提取符号?

在 Rails 中进行 Http 基本身份验证

ActiveRecord 回调列表

水豚 click_link 与 :href 匹配

RSpec > 有没有办法用一个命令运行所有测试?

在 rake 任务期间关闭观察者的简单方法?

.increment vs += 1

如何在Ruby 中对数字进行上限和舍入

RubyMine - 关闭在空行中间单击的功能

如何在 VS Code 中自动格式化 Ruby 或 .erb 文件?

ActiveRecord 事务中的错误处理?

为什么 RSpec 在 Rails 下这么慢?

如何在 Rails 中设置路由的默认格式?

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

# 轨道中的 TODO

Rails:如何在rails中使用dependent::destroy?

如何创建一个 ruby​​ Hello 世界?

如何获取 Rails 3.1 中assets资源 的绝对 URL?

期望 true 响应 true?