从params哈希创建Rails ActiveRecord模型

时间:2011-04-14 17:19:56

标签: ruby-on-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

2 个答案:

答案 0 :(得分:8)

根据ActiveRecord documentation,属性应根据数据库中的列类型自动进行类型转换。

答案 1 :(得分:5)

我实际上会在您的用户模型中添加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]),它遵循“保持你的控制器瘦”的座右铭