如何使用活动模型为date_select下拉菜单定义虚拟属性

时间:2012-08-14 06:42:19

标签: ruby-on-rails ruby-on-rails-3 activemodel

我在我的应用程序中使用活动模型进行付款处理,但我无法为信用卡到期日期添加字段,因为它会抛出错误,如下所示 未定义的方法`card_expiration_date(3i)='

在我的模特中:

class CartServer

  include ActiveModel::Validation

  include ActiveModel::Conversion

  extend ActiveModel::Naming

  attr_accessor :card_expiration_date

在视图中:

f.date_select :card_expiration_date,  :add_month_numbers => false,:discard_day => true, :start_year => (Date.today.year-10), :end_year => (Date.today.year+10),:order=>[ :month,:year]

3 个答案:

答案 0 :(得分:0)

如何通过Rails date_select设置attr_accessor日期并让Rails自动处理多属性:https://gist.github.com/paulsturgess/5500858

答案 1 :(得分:0)

属性:card_expiration_date,Type :: Date.new

答案 2 :(得分:0)

类似的事情将在Rails 6中起作用:

class CartServer
  include ActiveModel::Model
  include ActiveModel::Attributes
  include ActiveRecord::AttributeAssignment

  attribute :card_expiration_date, :date
end

这里有两点很重要:

  • 以类型attribute声明:date。在ActiveRecord模型中,此类型信息来自数据库架构,但是由于我们使用的是ActiveModel,因此需要显式声明它。

  • 包括ActiveRecord::AttributeAssignment以获得对多部分参数分配的支持。表单中的参数看起来像这样:

    {
      "card_expiration_date(1i)" => "2020",
      "card_expiration_date(2i)" => "12",
      "card_expiration_date(3i)" => "31",
    }
    

    ActiveModel::AttributeAssignment获得的ActiveModel::Model模块不知道如何将其转换为日期,因此我们需要引入功能更全的ActiveRecord版本。