【问题标题】:How can i replace a parameter by looping parameters in ruby?如何通过在 ruby​​ 中循环参数来替换参数?
【发布时间】:2020-02-15 13:22:23
【问题描述】:

我有一个参数数组,我想通过在 ruby​​ on rails 中循环数组来替换所有参数。

我在控制器中使用 before_action 作为

before_action :cost_format

这是一个参数数组。参数的格式是字符串,我想对每个参数运行一个函数并将其转换为浮点数。所以我正在循环一个数组并在每个元素上调用函数。

 def cost_format
    x = [params[:cost_1], params[:cost_2], params[:cost_3]]
    x.each do |i|
      convert_cost(i)
    end
 end

我有一个函数 convert_cost 如下

 def convert_cost(x)
   x.gsub(',', '.').to_f
 end

如何循环数组以替换我的参数。?参数没有被上面的代码替换。任何提示将不胜感激。 谢谢

【问题讨论】:

  • 试试map 而不是each
  • 地图也不起作用。例如 [1] pry(main)> x = 1 => 1 [2] pry(main)> y = 2 => 2 [3] pry(main)> z = 3 => 3 [4] pry(main )> a = [x, y, z] => [1, 2, 3] [5] pry(main)> a => [1, 2, 3] [6] pry(main)> a.map{ |我| i.to_s} => ["1", "2", "3"] [7] pry(main)> x => 1 这是在控制台中运行的
  • 是要改变原始的params,还是有一个变异的副本?
  • 我认为,正如@3limin4t0r 所建议的那样,您的问题未得到充分说明。 map,根据您在 cmets 中的示例,确实将整数转换为字符串并返回该字符串数组。它转换x 的值(不改变x)。我认为一个更完整的例子会有所帮助。

标签: ruby-on-rails arrays ruby parameters


【解决方案1】:

我想你会想要这样的东西:

def cost_format
  %i(cost_1 cost_2 cost_3).each do |key|
    params[key] = convert_cost(params[key])
  end
end

def convert_cost(val)
  val.gsub(',', '.').to_f
end

这会从您的 params 中获取每个键,并将其替换为通过 convert_cost 方法传递的值。


编辑:您可能可以忽略有关 convert_cost 的部分,如果它适用于您输入数字的格式。请原谅我的种族中心主义 :)

我还没有更新你的convert_cost 方法,但我对它目前是否有效有点担心。如果你有,例如"1,234,567",你打电话给你的gsub,你会得到"1.234.567"。打电话给to_f 会得到1.234,我认为你不会想要这个?

你可以使用:

def convert_cost(val)
  val.gsub(',', '').to_f
end

例如

convert_cost("1,234,567")
# => 1234567.0

结合所有这些,以下内容将被转换为:

params = { cost_1: "1,234,567", cost_2: "123", cost_3: "456.5", cost_4: "I won't be touched" }
# after `cost_format` before_action runs:
# => {:cost_1=>1234567.0, :cost_2=>123.0, :cost_3=>456.5, :cost_4=>"I won't be touched"}

如果您有任何问题,请告诉我 - 希望这会有所帮助。

【讨论】:

  • 如果您更喜欢范围语法,%i(cost_1 cost_2 cost_3) 也可以替换为 (:cost_1..:cost_3)
  • 感谢 @3limin4t0r,好提示 - 我什至没有想过要使用带符号的范围 :) 一如既往,一个有趣的补充和新的东西!
  • 仅供参考,将, 转换为. 的原因是因为一些国家(包括我的)使用, 来表示小数,我们使用. 作为千位分隔符。例如1.234,25
  • 我没有太多经验,我主要使用<input type="number" />来避免这个问题,因为网络浏览器将以国际格式提交数据。
  • “在使用 Rails 时,to_f 是否考虑了语言环境,还是需要像我突然出现的那样进行更改?”,不,它没有。 "1,234,567".to_f == 1.0.
【解决方案2】:

你可以试试类似的东西

x.map{|param| param.gsub(',', '.').to_f}

直接在您的阵列上。

所以你的cost_format 方法看起来像:

def cost_format
  x = [params[:cost_1], params[:cost_2], params[:cost_3]]
  result = x.map{|param| param.gsub(',', '.').to_f}
  # do stuff with result
end

我认为它不起作用的原因是,每个方法都返回其接收者,但 map 返回一个新数组。

【讨论】:

  • 虽然你解释map返回一个新数组。将它分配给result 之类的东西可能是个好主意,以明确从那时起变量result 包含格式正确的数组。这并不总是必要的,但从问题的表述方式来看,OP 对 Ruby 来说似乎有些新意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2017-07-14
  • 1970-01-01
相关资源
最近更新 更多