Пользовательское форматирование float в form_for - PullRequest
2 голосов
/ 10 января 2010

Есть ли способ управления форматом с плавающей точкой в ​​поле формы?

Я хочу отформатировать число с плавающей точкой как целое число, если модуль равен 0, в противном случае отображать число с плавающей точкой как есть. Я переопределил модель доступа для этого форматирования.

Когда загружается форма редактирования, я хотел бы иметь следующие преобразования:

stored value | accessor returns | form field shows
---------------------------------------------------
1.0          | 1                | 1
1.5          | 1.5              | 1.5

Однако form_for, по-видимому, напрямую обращается к атрибуту, отображая, таким образом, значение с плавающей точкой.

Есть идеи, как это обойти? Благодаря.

Ответы [ 5 ]

2 голосов
/ 11 февраля 2011

Использование

def my_float
  raw = read_attribute(:my_float)
  if raw == raw.to_i
    raw.to_i
  else
    raw
  end
end

в пределах form_for не будет работать, как отмечено ранее. Пробовал несколько раз. ИМХО это одна из самых серьезных проблем проектирования с рельсами. Как правило, у вас нет прямого (спокойного) доступа к модели с вашей точки зрения.

1 голос
/ 10 января 2010

Вы можете переопределить считыватель атрибутов, примерно так:

def myfloat
  if @myfloat == @myfloat.to_i
    @myfloat.to_i
  else
    @myfloat
  end
end

Теперь возвращаемое значение правильно отформатировано для вашей формы и все еще может использоваться в вашем приложении.

0 голосов
/ 23 апреля 2010

Вы можете переопределить response_to? в модели, чтобы остановить вызов value_before_type_cast.

def respond_to?(*args)
  if args.first.to_s == "my_float_before_type_cast"
    false
  else
    super
  end
end

И тогда вам также нужно:

def my_float
  raw = read_attribute(:my_float)
  if raw == raw.to_i
    raw.to_i
  else
    raw
  end
end
0 голосов
/ 11 января 2010

Решение Veger будет работать, если вы используете read_attribute для получения «сырого» значения:

def myfloat
  raw = read_attribute(:myfloat)
  if raw == raw.to_i
    raw.to_i
  else
    raw
  end
end

Как всегда при сравнении чисел с плавающей точкой, вы должны быть осторожны с округлением.

0 голосов
/ 10 января 2010

Я верю, что это сработает, когда вы сделаете что-то вроде этого:

<%= f.text_field :field_attribute, :value => format_method(f.object.field_attribute) %>

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

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