如何使用activemodel验证date_time_select

时间:2013-11-01 08:27:08

标签: ruby-on-rails-4 activemodel

我正在使用rails 4.0 我想知道如何使用activemodel验证date_select

让我们假设我有以下代码

应用程序/模型/ book.rb

class Book
  include ActiveModel::Model
  include ActiveModel::Validations

  attr_accessor :title, :written_on

  validates :title, presence: true, allow_blank: false
  # How validates :written_on if I use date_select Please look in my view below
end

应用程序/控制器/ books.rb

class BooksController < ApplicationController
   #...
   def new
     @book = Book.new
   end

   def create
     @book = Book.new(book_params)
     if @book.valid?
       #Do something
     end
   end
   #...
end

应用程序/视图/书籍/ new.html.erb

<% form_for @book do |f| %>
  ...
  <%= f.date_select :written_on %>
  ...
<% end %> 

我也尝试添加

attr_accessor 'written_on(1i)'

到我的书模型,但我得到了错误无效的属性名称'written_on(1i)'

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

为了澄清,我想你在问我为什么你甚至无法设置 written_on属性,更不用说验证它了 - 当我在本地使用你的确切代码时并试图创建一本新书,提交后我得到undefined method `written_on(1i)=' for Book

这是因为Book模型不是从ActiveRecord::Base继承的;您只需加入ActiveModel::ModelActiveModel::ValidationsThe Rails guide on form helpers说“当Active Record看到具有这些名称的参数时,它知道它们必须与其他参数组合并提供给适合于列类型的构造函数。”

因此,我开始查看Rails源代码,了解此功能的实现位置,目前位于ActiveRecord::AttributeAssignment。目前有an open pull request将此功能移至ActiveModel,以便在像您这样的情况下,您可以通过添加ActiveModel::AttributeAssignment来使用它。

我不确定在合并并发布之前你能做什么。我尝试包含ActiveRecord::AttributeAssignment并仍然得到相同的错误,并查看拉取请求,它似乎并不那么简单。您可以分叉Rails并应用该拉取请求,但是您必须保持自己的Rails一段时间,直到它落地,然后恢复已发布的版本。