/ / Railsy: Validates_format_of dla float nie działa - ruby-on-raili, sprawdzanie poprawności, zmiennoprzecinkowe, format

Railsy: Validates_format_of dla float nie działa - ruby-on-raili, sprawdzanie poprawności, zmiennoprzecinkowe, format

Jestem nowy w Ruby on Rails. Próbowałem zweryfikować format jednego z atrybutów, aby wprowadzić tylko float.

validates :price, :format => { :with => /^[0-9]{1,5}((.[0-9]{1,5})?)$/, :message => "should be float" }

ale gdy wprowadzę tylko znak w cenie, akceptuje go i pokazuje wartość 0.0 dla ceny. Czy ktoś może powiedzieć, co jest w tym złego, a dlaczego tak się dzieje?

Odpowiedzi:

0 dla odpowiedzi № 1

Liczba zmiennoprzecinkowa to liczba, a wyrażenia regularne to ciągi.

Wygląda na to, że po wprowadzeniu ciągu znaków dla elementu zmiennoprzecinkowego program Rails automatycznie konwertuje go jako 0.0.

Czy masz wartość domyślną (0.0) w kolumnie? Jeśli tak, możesz spróbować go usunąć i użyć validates_presence_of :price tylko.


Coś do wypróbowania: zamiast umieszczać ciąg bezpośrednio w price kolumnę, umieść ją w price_string attr i użyj a before_save oddzwanianie, aby spróbować przekonwertować ciąg na cenę. Coś w tym stylu:

attr_accessor :price_string

before_save :convert_price_string

protected
def convert_price_string
if price_string
begin
self.price = Kernel.Float(price_string)
rescue ArgumentError, TypeError
errors.add(ActiveRecord::Errors.default_error_messages[:not_a_number])
end
end

I w swojej formie zmień nazwę pola tekstowego na :price_string.


9 dla odpowiedzi nr 2

To jest moje rozwiązanie,

validates :price,presence:true, numericality: {only_float: true}

kiedy wypełnisz na przykład 7, automatycznie przeniesiesz wartość do 7.0


3 dla odpowiedzi nr 3

Dla szyn 3:

validates :price, :format => { :with => /^d+??(?:.d{0,2})?$/ },
:numericality =>{:greater_than => 0}