2016-03-30 3 views
0

Ich habe ein ziemlich einfaches Formular.Format Validierung Regex auf Modell wird ausgelöst, wenn der Wert leer ist, wenn es nicht

<%= form_for([@category_item_value], url: create_category_item_value_path(key_id: item_key.id), method: :post) do |f| %> 
     <%= render 'shared/error_messages', object: f.object %> 
     <%= f.label :stat %> 
     <%= f.text_field :value, :value => item_key.value %> 
     <%= f.hidden_field :key_type, :value => 'item-edit-request' %> 
     <%= f.submit "Submit" %> 

Mit diesem Modell

validates :key, length: { maximum: 255 }, 
    exclusion: { in: %w(create edit new update), message: "%{value} cant be taken." }, 
format: { with: /\A[a-zA-Z0-9_-]+\z/, message: "only allows letters, numbers and '-'" } 


validates :value, length: { maximum: 65000 } 

Als ich senden Sie das Formular der key Wert leer oder null in der DB bleibt, weil es später in hinzugefügt wird. Problem ist, dass ich das Formular nicht einreichen kann, weil die Formatvalidierung auf Schlüssel mich mit der Fehlermeldung "nur Buchstaben, Zahlen und '-'" stoppt.

Warum tut es dies, ich habe keine presence: :true Validierung auf key, aber ich kann es nicht lassen wegen der Formatüberprüfung leer sein. Das war nie ein Problem und die Form funktionierte gut, es war nur bis vor kurzem, dass ich es noch einmal durchging und merkte, dass das Formular nicht eingereicht wurde.

Warum würde dies beginnen und wie kann ich es beheben?

Antwort

2

Sie müssen nur die allow_blank Option hinzufügen, sonst wird Ihre Regexp tatsächlich nicht übereinstimmen und die Formatüberprüfung wird fehlschlagen. Siehe rails guides für Validierungsoptionen, die für alle Validierungen gelten.

So sollten folgende Arbeiten:

validates :key, length: { maximum: 255 }, 
       exclusion: { in: %w(create edit new update), message: "%{value} cant be taken." }, 
       format: { with: /\A[a-zA-Z0-9_-]+\z/, 
          allow_blank: true, 
          message: "only allows letters, numbers and '-'" } 

Eine weitere Möglichkeit, die regexp optionale Zeichen zu ändern ist (mit * statt +), wie folgt aus:

... 
with: /\A[a-zA-Z0-9_-]*\z/ , 
... 
+1

Letzteres ist expliziter , MEINER BESCHEIDENEN MEINUNG NACH. – mudasobwa

+0

Ich stimme zu, OTOH Ich finde die erste Option leichter lesbar (einfacher auf den ersten Blick zu erkennen). – BoraMa

+0

Kann ich beide zulassen NULL und erlauben leer? – Rob

Verwandte Themen