Rails validates_length_of ведет себя неправильно - PullRequest
2 голосов
/ 28 апреля 2010

У меня есть модель rails, к которой я добавляю валидации, и мне кажется, что я столкнулся с какой-то странностью от одного из валидаторов.

Итак, вот таблица, с которой я работаю (из 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

Если я отправляюсь в браузер и загружаю представление (/ clients / new), я ввожу client_id и имя, выбираю офис, а затем нажимаю "Отправить". Валидатор неправильно выбирает :client_id, так как он всегда будет с ошибками «слишком короткие» или «слишком длинные».

Кикер в том, что он выдаст мне «слишком короткую» ошибку, пока я не попробую около 11 символов, затем при 12 символах я получу «слишком длинную». Таким образом, 11 является пороговым значением «слишком короткого», даже если диапазон должен быть «5,7», но иногда вместо «слишком длинного» сообщения оно фактически проверяет и вставляет запись, но записывает ее У «insert_id» совершенно другой номер для «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 Ответ

1 голос
/ 28 апреля 2010

client_id столбец является целым числом. 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...