ruby-on-rails - 如何使用事件模型为 date_select 下拉菜单定义虚拟属性

标签 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]
)

最佳答案

像这样的东西将在 Rails 6 中工作:

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

  attribute :card_expiration_date, :date
end

这里有两件事很重要:

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

  • 包括 ActiveRecord::AttributeAssignment 以获取对多部分参数分配的支持。表单中的参数将如下所示:

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

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

关于ruby-on-rails - 如何使用事件模型为 date_select 下拉菜单定义虚拟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11947040/

相关文章:

ruby-on-rails - 用于测试Web应用程序的工具(使用Ruby on Rails/Mongo DB开发)

ruby-on-rails - 如何使用模块动态地将类方法添加到 Rails 模型

javascript - 将 Ajax 部分 View 模板放在 Assets/javascripts 目录中而不是 Views 目录中,Rails

javascript - Rails 仅在 current_user logged_in 时执行 javascript

ruby-on-rails - 在Omniauth和Ruby on Rails 3中使用YouTube登录

ruby-on-rails - Rails 3自定义格式验证错误?

ruby-on-rails - Self.find 方法 Active Model in Rails 不起作用

ruby-on-rails - 报告记录验证警告和错误的有效方法?

mysql - 不确定发生了什么的繁重查询

ruby-on-rails - 滑轨更改 Controller 中参数的值