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

app/controllers/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)'

私の本のモデルに

ここで助けてくれて本当にありがとう。

4

1 に答える 1

4

明確にするために、属性を設定することさえできない理由を尋ねていると思います.written_onundefined method `written_on(1i)=' for Book

これは、Bookモデルが から継承されていないためActiveRecord::Baseです。と を含めているだけActiveModel::ModelですActiveModel::Validationsフォーム ヘルパーに関する Rails ガイドでは、「Active Record がそのような名前のパラメーターを検出すると、他のパラメーターと組み合わせて、列の型に適したコンストラクターに渡す必要があることを認識します」と述べています。

そこで、Rails のソースを調べて、この機能が実装されている場所を調べたところ、現在ActiveRecord::AttributeAssignmentにあります。現在、この機能を ActiveModel に移行するオープン プル リクエストがあり、あなたのような場合に を含めることで使用できるようになりますActiveModel::AttributeAssignment

それがマージされてリリースされるまで、何ができるかわかりません。含めてみActiveRecord::AttributeAssignmentましたが、それでも同じエラーが発生しました。プルリクエストを見ると、それほど単純ではないようです。Rails を fork してそのプル リクエストを適用することもできますが、それが実現するまでしばらくの間、独自の Rails を維持し、その後リリースされたバージョンに戻す必要があります。

于 2013-11-10T16:19:11.320 に答える