Минимальное значение для ввода в простой форме
Я хочу создать простой денежный ввод SImpleForm.
Таким образом, денежное поле должно иметь минимальное значение, равное 0, так что пользователь не может ввести значение меньше 0.
Однако я не знаю, как определить минимальное значение с помощью простой формы.
Интересно, возможно ли это.
Ответы
Ответ 1
Конечно! (Упрощенный) HTML для формы, которую вы хотите, выглядит примерно так:
<form>
<input type="number" min="0" step="any" name="amount">
</form>
Обратите внимание на два действительно важных свойства в поле ввода: min
установлено в 0, потому что вы не допускаете отрицательных чисел, а step
установлено на any
, потому что вы хотите разрешить десятичные числа. Если вам нужны только долларовые суммы, вы можете установить step="1"
, например. Кроме того, если вы хотите установить максимальное значение с помощью атрибута max
.
Важное примечание: это выполняется только на стороне клиента. Это можно переопределить, если вы знаете, что делаете, поэтому убедитесь, что вы все еще проверяете, что вход, отправленный с этой формой, действителен на сервере.
Я не парень из Ruby, но, прочитав Документы Simple Form, я думаю, что это должно работать:
<%= simple_form_for @transaction do |f| %>
<%= f.input :amount, input_html: { min: '0', step: 'any' } %>
<%= f.button :submit %>
<% end %>
Предполагая, что количество - это тип номера в вашей модели, он автоматически сделает ввод [type = number] для вас.
Ответ 2
simple_form
будет устанавливать атрибуты ввода на основе валидации модели, а это означает, что ваши проверки на стороне клиента и на стороне сервера будут соответствовать и охватывают пользователей с фантастическими современными браузерами, которые поддерживают новые типы и атрибуты HTML5, а пользователи с старые браузеры, которые этого не делают.
Например, с учетом этой модели:
class Purchase < ActiveRecord::Base
validates :amount, numericality: { greater_than_or_equal_to: 1 }
end
И этот взгляд:
<%= simple_form_for Purchase.new do |f| %>
<%= f.input :amount %>
<% end %>
Полученная разметка будет выглядеть примерно так (для ясности я удалил некоторые атрибуты):
<form …>
<div>
<label for="purchase_amount">Amount</label>
<input id="purchase_amount" name="purchase[amount]"
min="1" step="1" type="number" />
</div>
</form>
Как отмечено в другом ответе, если вы хотите переопределить атрибуты по умолчанию, вы можете использовать опцию input_html
при вызове #input
:
<%= simple_form_for Purchase.new do |f| %>
<%= f.input :amount, input_html: { min: 0 } %>
<% end %>
Ответ 3
Для ответа @georgebrock на работу, в simple_form.rb(или любое другое имя, которое вы используете, может быть simple_form_bootstrap.rb), вам нужно изменить:
b.optional :min_max
To:
b.use :min_max
Для обертки, используемой для рисования ввода.
"Необязательный" означает, что простая форма будет использовать компонент, но не будет автоматически искать, позволяя вам указать: min и: max params на входе вручную.
Ответ 4
Ответ @alexander-s обычно правильный.
Однако у меня была проблема с то, что simple_form.rb был переброшен при помощи simple_form_bootstrap.rb, что они НЕ дают вам указаний измениться. b.optional :min_max
много мест.
Вместо глобальной настройки b.use :min_max
упомянутой @alexander-s, я использовал
<%= f.input :amount, min_max: true %>
Это лучше, поскольку он использует минимальный номер, установленный в вашей модели.