Создание модели Rails ActiveRecord из хэша params

В большинстве руководств 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

Ответ 1

В соответствии с документацией ActiveRecord атрибуты должны автоматически присваиваться типам на основе типов столбцов в базе данных.

Ответ 2

Я бы фактически добавил обратный вызов 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]) в своем контроллере, который следует за девизом "Держите ваши контроллеры тощими"