【问题标题】:Creating Rails ActiveRecord model from params hash从参数哈希创建 Rails ActiveRecord 模型
【发布时间】:2011-04-14 17:19:55
【问题描述】:

大多数 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

【问题讨论】:

  • 您确定 params[:user] 将包含所有字符串吗?我认为当您将它与 AR 一起使用时,params 哈希将被正确转换。
  • @rmk 是的,你是对的。我在下面添加了一个答案,基本上说了同样的话。我会将其标记为已接受的答案,但我必须等待 2 天才能将自己的答案标记为已接受的答案。

标签: ruby-on-rails activerecord


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看来应该可以了。这是这样做的“轨道方式”吗?这似乎是一种经常出现的情况,但在我的一生中,我找不到任何显示这一点的教程/指南。
    • 添加了一个我更喜欢的新版本。
    • 我喜欢 before_save 版本。不过问题是:根据this,Rails 足够聪明,可以在执行@user = User.new(params[:user]) 之类的操作时为您进行转换。如果是这样的话,那我想这没有必要吗?不过我不确定这是不是真的。
    • 是的,在一般情况下,rails 会将值类型转换为列的类型。但是,如果您需要更多灵活性等,这是一个很好的解决方案
    • 这在 Rails 5 中不再可能。我能做些什么呢?
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多