2010-04-28 4 views
2

У меня есть модель рельсов, к которой я добавляю валидации, и я, похоже, столкнулся с некоторой странностью от одного из валидаторов.Rails validates_length_of является ошибочным

Так вот таблица я работаю с (С schema.rb):

create_table "clients", :force => true do |t| 
    t.string "name" 
    t.string "last_contact" 
    t.integer "contacting_agent" 
    t.date  "last_payment_date" 
    t.float "last_payment_amt" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "office" 
    t.integer "client_id" 
    end 

У меня есть нормальный вид, с:

<%= error_messages_for 'client' %> 
<h1>New Client</h1> 
<% form_for @client do |new| %> 

<table id='newform'> 
<tr> 
    <th>Field</th> 
    <th>Value</th> 
</tr> 
<tr> 
    <td> 
    ID 
    </td> 
    <td> 
    <%= new.text_field :client_id %> 
    </td> 
</tr> 
<tr> 
    <td> 
    Name 
    </td> 
    <td> 
    <%= new.text_field :name %> 
    </td> 
</tr> 
<tr> 
    <td> 
    Office 
    </td> 
    <td> 
    <%= new.select :office, $offices %> 
    </td> 
</tr> 
<tfoot> 
    <tr> 
    <td> 
    <%= image_submit_tag "/images/icons/save_32.png" %> 
    <a href="/clients/new" title="Clear"><%= image_tag "/images/icons/close_32.png" %></a> 
    </td> 
    <td> 
    &nbsp; 
    </td> 
    </tr> 
</tfoot> 
</table> 

<% end %> 

и моя скромная модель

class Client < ActiveRecord::Base 
    validates_length_of :client_id, :in => 5..7 
    validates_uniqueness_of :client_id 
    validates_presence_of :name, :client_id 
end 

Итак, часть, которая пинает мою задницу, является первой валидацией в модели.

validates_length_of :client_id, :in => 5..7 

Если я голова в браузер и загрузить вид (/ клиентов/новые), я вхожу в client_id и имя, выберите офис, а затем нажмите кнопку. Валидатор не правильно подбирает :client_id, так как он всегда будет терпеть неудачу с сообщениями «слишком короткий» или «слишком длинный».

Кикер в том, что он даст мне слишком короткую ошибку до тех пор, пока я не попробую около 11 символов, а затем на 12 символов, я получаю «слишком длинный». Таким образом, 11 является порогом «слишком коротким», даже если диапазон должен быть «5..7», но иногда вместо «слишком длинного» сообщения он фактически проверяет и вставляет запись, но запись вставки имеет совершенно другое число для «client_id», и это всегда одно и то же, несмотря на validates_uniqueness_of.

Что я думаю, так это то, что :client_id, вместо проверки действительного поля client_id, он пытается подобрать идентификатор объектов и проверить его. По крайней мере, это единственное, о чем я могу думать.

Parameters: {"x"=>"13", "y"=>"14", "authenticity_token"=>"removed", "client"=>{"name"=>"test345", "client_id"=>"12345678", "office"=>"US10"}} 

выше, из журналов сервера, проверяет, как «слишком коротким» для :client_id

Так, пожалуйста, есть ли способ исправить эту странность? (Примечание: я пробовал validates_length_of "client_id", :in => 5..7, но не получил абсолютно никакой проверки)

ответ

1

client_id column is integer. validates_length_of использует метод size для определения длины поля, а для целого числа он просто дает вам размер переменной в байтах, что, вероятно, 4 для первых 11 "символов" и 8 для 12+.

Если вам действительно нужно client_id быть целым числом и проверять длину, вероятно, можно использовать:

validates_inclusion_of :client_id, :in => 10000..9999999, :message => "should be between 5 and 7 characters" 
+0

Спасибо за указание, что ко мне. Кажется ясным как день, теперь LOL. Я просто переключаюсь на 'validates_format_of: client_id,: with =>/\ A \ d {5,7} \ z /' и использую регулярное выражение. –

+0

Если это столбец Integer в базе данных, 'validates_inclusion_of' не будет работать, потому что значение из формы является строкой. Вы хотите 'validates_numerical_of' с параметрами': more_than_or_equal_to' и ': less_than_or_equal_to'. –

+0

Фактически это будет, потому что значение преобразуется в целое число, когда поле назначено. '>> c = Client.new (: client_id =>" 22222 ")'; '>> c.client_id'; '=> 22222' – Voyta

Смежные вопросы