2013-11-01 47 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

這是一個很棒的答案! –

相關問題