从参数哈希创建Rails ActiveRecord模型

问题描述

| 大多数Rails教程都显示如何通过params哈希填充模型类,如下所示:
class UsersController < ApplicationController   
    def create
        @user = User.create(params[:user])

        # more logic for saving user / redirecting / etc.     
    end  
end
如果模型中的所有属性都应为字符串,则此方法非常有用。但是,如果某些属性应该是整数或日期或其他某种类型,该怎么办? 例如,假设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
回调,以确保所需的值采用正确的格式,即:
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])
,就座右铭“让您的控制器保持瘦”。