Минимальное значение для ввода в простой форме

Я хочу создать простой денежный ввод 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 %>

Это лучше, поскольку он использует минимальный номер, установленный в вашей модели.