2010-11-23 2 views
1

Я столкнулся с странным поведением в создании экземпляров модели rails3.Rails 3, почему Model.new делает неявное преобразование?

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

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 определяются как целое число в базе данных?

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

Спасибо :)

ответ

1

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

EDIT

К сожалению, я был неправ насчет «выполняет свою проверку по этому заранее напечатанный значение» части. Глядя на код проверки, он вызывает .to_s на значение post-typecast, которое в вашем случае возвращает "0" и поэтому проходит проверку.

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

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