Rails Way: форматирование значения перед его настройкой в ​​модели? - PullRequest
5 голосов
/ 03 декабря 2010

У меня есть поля формы, в которые пользователь вводит:

  • проценты: 50.5%
  • деньги: $144.99
  • даты: Wednesday, Jan 12th, 2010

...

Атрибуты типа percent и money сохраняются как поля decimal с ActiveRecord, а даты - как поля datetime или date.

Легко конвертировать между форматами в javascript, и вы можете теоретически преобразовать их в приемлемый формат activerecord onsubmit, но это не приличное решение.

Я бы хотел что-то переопределить средства доступа в ActiveRecord, поэтому, когда они установлены, он преобразует их из любой строки в соответствующий формат, но это тоже не лучший вариант.

Чего я не хочу, так это запускать их через отдельный объект процессора, для чего в контроллере потребуется нечто подобное:

def create
  # params == {:product => {:price => "$144.99", :date => "Wednesday, Jan 12, 2011", :percent => "12.9%"}}
  formatted_params = Product.format_params(params[:product])
  # format_params == {:product => {:price => 144.99, :date => Wed, 12 Jan 2011, :percent => 12.90}}
  @product = Product.new(format_params)
  @product.save
  # ...
end

Я бы хотел, чтобы он был полностью прозрачным. Где хук в ActiveRecord, поэтому я могу сделать это Rails Way ?

Обновление

Я просто делаю это сейчас: https://gist.github.com/727494

class Product < ActiveRecord::Base
  format :price, :except => /\$/
end

product = Product.new(:price => "$199.99")
product.price #=> #<BigDecimal:10b001ef8,'0.19999E3',18(18)>

Ответы [ 3 ]

31 голосов
/ 04 декабря 2010

Вы можете переопределить сеттер или геттер.

Переопределение сеттера:

class Product < ActiveRecord::Base
  def price=(price)
    self[:price] = price.to_s.gsub(/[^0-9\.]/, '')
  end
end

Переопределение геттера:

class Product < ActiveRecord::Base
  def price
    self[:price].to_s.gsub(/[^0-9\.]/, ''))
  end
end

Разница в том, что последний метод по-прежнему сохраняет все введенные пользователем данные, но извлекает их в отформатированном виде, а первый - в отформатированной версии.

Эти методы будут использоваться при вызове Product.new(...) или update_attributes и т. Д. *

12 голосов
/ 03 декабря 2010

Вы можете использовать хук перед проверкой для нормализации ваших параметров, таких как before_validation

class Product < ActiveRecord::Base

     before_validation :format_params


      .....


     def format_params
        self.price = price.gsub(/[^0-9\.]/, "")
        ....
     end
1 голос
/ 07 апреля 2014

Используйте монетизировать камень для разбора чисел.

Пример

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