2013-11-01 19 views
2

我使用的轨道date_time_select 4.0 我不知道如何验证date_select与activemodel的如何使用activemodel的来验证

让我们假设我的代码如下

应用程序/模型/ 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 

应用程序/争夺WS /书籍/ new.html.erb

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

我也尝试添加

attr_accessor 'written_on(1i)' 

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

非常感谢您的帮助。

回答

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一段时间,直到登陆,然后回到发布的版本。

+0

谢谢你的回复@ carols10cents。你有没有关于工作的任何想法。现在我实际上使用一个选择日期,月份和年份的不同名称。然后重写before_validation将它们连接在一起成为一个新的日期类型对象。你怎么看? –

+0

这听起来像它会很乏味,但会工作:) – carols10cents

+0

这是一个很棒的答案! –

相关问题