我正在使用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)'
非常感谢您的帮助。
答案 0 :(得分:4)
为了澄清,我想你在问我为什么你甚至无法设置 written_on
属性,更不用说验证它了 - 当我在本地使用你的确切代码时并试图创建一本新书,提交后我得到undefined method `written_on(1i)=' for Book
。
这是因为Book
模型不是从ActiveRecord::Base
继承的;您只需加入ActiveModel::Model
和ActiveModel::Validations
。 The Rails guide on form helpers说“当Active Record看到具有这些名称的参数时,它知道它们必须与其他参数组合并提供给适合于列类型的构造函数。”
因此,我开始查看Rails源代码,了解此功能的实现位置,目前位于ActiveRecord::AttributeAssignment。目前有an open pull request将此功能移至ActiveModel,以便在像您这样的情况下,您可以通过添加ActiveModel::AttributeAssignment
来使用它。
我不确定在合并并发布之前你能做什么。我尝试包含ActiveRecord::AttributeAssignment
并仍然得到相同的错误,并查看拉取请求,它似乎并不那么简单。您可以分叉Rails并应用该拉取请求,但是您必须保持自己的Rails一段时间,直到它落地,然后恢复已发布的版本。