2

我正在使用 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

app/views/books/new.html.erb

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

我也尝试添加

attr_accessor 'written_on(1i)'

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

非常感谢这里的帮助。

4

1 回答 1

4

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

这是因为Book模型没有继承自ActiveRecord::Base; 你只是包括ActiveModel::Modeland ActiveModel::Validations关于表单助手的 Rails 指南说“当 Active Record 看到具有此类名称的参数时,它知道它们必须与其他参数组合并提供给适合列类型的构造函数。”

所以我开始查看 Rails 源代码,看看这个功能是在哪里实现的,它目前在ActiveRecord::AttributeAssignment中。目前有一个开放的拉取请求将此功能移动到 ActiveModel,以便在像您这样的情况下,您可以通过包含ActiveModel::AttributeAssignment.

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

于 2013-11-10T16:19:11.320 回答