Как я могу заменить параметр, зациклив параметры в рубине? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть массив параметров, и я хочу заменить все параметры циклическим перебором массива в ruby ​​на рельсах.

Я использую 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

Как зациклить массив так, чтобы мои параметры были заменены.? Параметры не заменяются приведенным выше кодом. Любая подсказка будет оценена. Спасибо

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Я думаю, вы захотите что-то вроде этого:

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

EG

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"}

Дайте мне знать, как вы поживаете, или если у вас есть какие-либо вопросы - надеюсь, это поможет.

1 голос
/ 18 октября 2019

Не могли бы вы попробовать что-то вроде

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 возвращает новый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...