【问题标题】:Split on second comma in ruby拆分红宝石中的第二个逗号
【发布时间】:2016-10-30 08:38:21
【问题描述】:

为“不太好的问题”道歉。当你闭上眼睛但你的大脑一直在思考代码时,就会发生这种情况。

这点让我很困惑。我想在逗号上拆分一个字符串以使其成为一个数组,或者...,如果我可以将数组发送到我的控制器那么完美但我所做的任何事情似乎都无法正常工作,所以可能的工作是在第二个逗号上拆分在一个字符串中。

我有一个如下所示的状态数组:

因此,当我使用params[:file].split(",") 时,我收到data:image/jpeg;base64 的句柄错误,因为当代码本身正确时,它会在第一个逗号处拆分。一个愚蠢的问题,你能把 ruby​​ 中的第二个逗号分开吗?

数组是这样的:["data:image/jpeg;base64,/9j/xxxxxx,data:image/jpeg;base64,/9j/xxxxxx"]

我的输入看起来像这样,我尝试了file[]file[][] 的许多变体

<input type="hidden" name="file" value={this.state.files} />

我使用concat 来获取数组。

【问题讨论】:

  • 好的,所以看看这个,你真正想要的是字符串中以“data:”开头的每个子字符串,是吗?这对您找到其他解决方案有帮助吗?
  • 是的。不,我还没有找到另一种解决方案。抱歉,我的脑力已经耗尽。
  • 如何使用 rgex 匹配 "data:.*" 的所有实例? stackoverflow.com/questions/27881549/…
  • 灵丹妙药params[:file].gsub(',data', '|data').split('|')
  • @LongNguyen 好的....有效!但是未来base64的格式会发生变化吗?

标签: ruby-on-rails arrays ruby split ruby-on-rails-5


【解决方案1】:
params[:files].split(",").each_slice(2).map { |top| "#{top.first},#{top.last}"}

基本上你可以像往常一样用“,”分割,然后将每两个元素合并在一起:)

str = '["data:image/jpeg;base64,/9j/xxxxxx,data:image/jpeg;base64,/9j/xxxxxx"]'
str.split(",").each_slice(2).map{ |top| "#{top.first},#{top.last}"}
 => ["[\"data:image/jpeg;base64,/9j/xxxxxx", "data:image/jpeg;base64,/9j/xxxxxx\"]"]

【讨论】:

    【解决方案2】:

    您还可以在发送到 Rails 之前以不同的方式序列化 files 数组。

    发送文件的代码是什么样的?

    如果有的话,你能像这样加入它,用一些独特的分隔符吗?

    makeRequest({ file: this.state.files.join('---') });
    

    然后在 Ruby 中拆分

    params[:file].split('---')
    

    【讨论】:

    • 好吧,在反应:var files = this.state.files.join('---'); 那么输入值将是files。作品。谢谢。
    • 不客气。一般来说,如果您必须将某些内容序列化为字符串,最好选择一个您知道不会自然发生的分隔符。如果是 POST 请求,也许更好的方法是将您的参数作为 JSON 发送,然后您将免费获得数组解析。
    • 它已经发布,但我几乎放弃了,因为它没有按预期工作。但是您的代码挽救了这一天。
    【解决方案3】:
    result = []
    incoming_data.gsub(/"data:\S+"/) {|member| result << member}
    

    也许这样……

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 我应该删除我的答案吗?
    【解决方案4】:
    str = "Now is the time for citizens, every last one, to revolt, without delay."
    
    i1 = str.index(',') 
    i2 = i1 + 1 + str[i1+1..-1].index(',')
    [str[0..i2-1], str[i2+1..-1]]
      # => ["Now is the time for citizens, every last one",
      #     "to revolt, without delay."]
    

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 2011-07-25
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多