web-dev-qa-db-fra.com

Valeur minimale pour l'entrée dans un formulaire simple

Je veux créer une entrée d'argent simple avec SImpleForm .

Ainsi, le champ monétaire doit avoir une valeur minimale égale à 0, de sorte que l'utilisateur ne puisse pas entrer une valeur inférieure à 0.

Cependant, je ne sais pas comment définir la valeur minimale avec un formulaire simple.

Je me demande si c'est possible.

15
com

Absolument! Le code HTML (simplifié) du formulaire souhaité ressemble à ceci:

<form>
    <input type="number" min="0" step="any" name="amount">
</form>

Notez les deux propriétés vraiment importantes dans le champ de saisie: min est défini sur 0, car vous n'autorisez pas les nombres négatifs, et step est défini sur any, car vous souhaitez autoriser les décimales. Si vous souhaitez uniquement des montants en dollars, vous pouvez pourrait définir step="1", par exemple. En outre, si vous souhaitez définir une valeur maximale, vous pouvez utiliser l'attribut max.

Remarque importante: ceci n’effectue que la validation côté client. Il est possible de remplacer cette information si vous savez ce que vous faites. Assurez-vous donc de toujours valider que l'entrée saisie avec ce formulaire est valide sur le serveur.

Je ne suis pas un gars Ruby, mais en lisant la docs de la forme simple , je pense que cela devrait fonctionner:

<%= simple_form_for @transaction do |f| %>
    <%= f.input :amount, input_html: { min: '0', step: 'any' } %>
    <%= f.button :submit %>
<% end %>

En supposant que montant est un type de nombre dans votre modèle, il effectuera automatiquement une entrée [type = nombre] pour vous.

21
Ryan Erdmann

simple_form définira les attributs d'entrée en fonction des validations du modèle, ce qui signifie que vos validations côté client et côté serveur correspondront et couvriront les utilisateurs avec des navigateurs modernes sophistiqués prenant en charge les nouveaux types et attributs d'entrée HTML5, et les utilisateurs avec des navigateurs plus anciens qui ne le font pas. .

Par exemple, étant donné ce modèle:

class Purchase < ActiveRecord::Base
  validates :amount, numericality: { greater_than_or_equal_to: 1 }
end

Et cette vue:

<%= simple_form_for Purchase.new do |f| %>
  <%= f.input :amount %>
<% end %>

Le balisage résultant ressemblera à quelque chose comme ceci (j'ai supprimé certains attributs pour plus de clarté):

<form …>
  <div>
    <label for="purchase_amount">Amount</label>
    <input id="purchase_amount" name="purchase[amount]"
           min="1"  step="1" type="number" />
  </div>
</form>

Comme indiqué dans une autre réponse, si vous souhaitez remplacer les attributs par défaut, vous pouvez utiliser l'option input_html lorsque vous appelez #input:

<%= simple_form_for Purchase.new do |f| %>
  <%= f.input :amount, input_html: { min: 0 } %>
<% end %>
6
georgebrock

Pour répondre au travail de @ georgebrock, dans simple_form.rb (ou quel que soit le nom que vous utilisez, il pourrait s'agir de simple_form_bootstrap.rb), vous devez le modifier:

b.optional :min_max

À:

b.use :min_max

Pour l'encapsuleur utilisé pour dessiner l'entrée.

Le terme "facultatif" signifie que la forme simple utilisera le composant mais ne recherchera pas automatiquement, vous permettant de spécifier manuellement les paramètres: min et: max.

4
Alexander S.

La réponse de @ alexander-s est normalement juste.

Cependant, j’ai eu un problème avec simple_form.rb qui était écrasé par simple_form_bootstrap.rb, car ils vous demandaient de ne PAS changer. Il répertorie b.optional :minmax plusieurs endroits.

Au lieu du paramètre global de b.use :minmax mentionné par @ alexander-s, j’ai utilisé 

<%= f.input :amount, minmax: true %>

C’est mieux car cela réutilise le nombre minimal défini dans votre modèle.

0
oma