Rails 3, почему Model.new делает неявное преобразование? - PullRequest
1 голос
/ 23 ноября 2010

Я сталкиваюсь со странным поведением в реализации модели rails3.

Итак, у меня есть простая модель:

class MyModel < ActiveRecord::Base
  validates_format_of :val, :with => /^\d+$/, :message => 'Must be an integer value.'
end

Тогда простой контроллер:

def create
  @mod = MyModel.new(params[:my_model])
  if @mod.save
    ...
  end
end

сначала params[:my_model].inspect возвращает:

{:val => 'coucou :)'}

Но после звонка @mod = MyModel.new(params[:my_model]) ...

Теперь, если я позвоню @mod.val.inspect, я получу:

0

Почему я не получаю исходную строку?

В конце проверки успешны, потому что val действительно целое число ...

Это потому, что val определено как целое число в базе данных?

Как мне избежать такого поведения и позволить проверке выполнить свою работу?

Спасибо:)

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Для вашего случая есть также подходящий валидатор:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_numericality_of

1 голос
/ 23 ноября 2010

Если val определено как целое число в вашей схеме, то вызов @my_model.val всегда вернет целое число, потому что AR выполняет приведение типов.Это не ново для рельсов 3, это всегда так работало.Если вы хотите, чтобы исходное строковое значение было назначено в контроллере, попробуйте @my_model.val_before_type_cast.Обратите внимание, что validates_format_of выполняет проверку для этого значения перед типизацией, поэтому вам не нужно указывать его там.часть «выполняет валидацию для этого значения перед типизацией».Глядя на код проверки, он вызывает .to_s для значения после типизации, которое в вашем случае возвращает "0" и, следовательно, проходит проверку.

Я бы посоветовал не беспокоиться о проверке, если честно,Если 0 не является допустимым значением для этого столбца, проверьте это напрямую, в противном случае просто полагайтесь на приведение типов.Если пользователь введет 123 foo, вы получите 123 в базе данных, что обычно просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...