Ответ 1
В соответствии с документацией ActiveRecord атрибуты должны автоматически присваиваться типам на основе типов столбцов в базе данных.
В большинстве руководств Rails показано, как заполнить класс модели с помощью хэша params следующим образом:
class UsersController < ApplicationController
def create
@user = User.create(params[:user])
# more logic for saving user / redirecting / etc.
end
end
Это отлично работает, если все атрибуты в вашей модели должны быть строками. Однако, что произойдет, если некоторые из атрибутов должны быть int или датами или каким-либо другим типом?
Например, скажем, класс User выглядит так:
class User < ActiveRecord::Base
attr_accessible :email, :employment_start_date, :gross_monthly_income
end
Атрибут: email должен быть строкой, атрибут: employment_start_date должен быть датой, а значение: gross_monthly_income должно быть десятичным. Чтобы эти атрибуты имели правильный тип, нужно ли мне изменить действие контроллера, чтобы вместо этого выглядеть что-то подобное?
class UsersController < ApplicationController
def create
@user = User.new
@user.email = params[:user][:email]
@user.employment_start_date = params[:user][:employment_start_date].convert_to_date
@user.gross_monthly_income = params[:user][:gross_monthly_income].convert_to_decimal
# more logic for saving user / redirecting / etc.
end
end
В соответствии с документацией ActiveRecord атрибуты должны автоматически присваиваться типам на основе типов столбцов в базе данных.
Я бы фактически добавил обратный вызов before_save
в вашей модели пользователей, чтобы убедиться, что нужные значения находятся в правильном формате i.e.:
class User < ActiveRecord::Base
before_save :convert_values
#...
def convert_values
gross_monthly_income = convert_to_decimal(gross_monthly_income)
#and more conversions
end
end
Итак, вы можете просто вызвать User.new(params[:user])
в своем контроллере, который следует за девизом "Держите ваши контроллеры тощими"