【问题标题】:How to use activemodel to validates date_time_select如何使用 activemodel 来验证 date_time_select
【发布时间】:2013-11-01 08:27:08
【问题描述】:

我正在使用 Rails 4.0 我想知道如何使用 activemodel 验证 date_select

假设我的代码如下

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

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

非常感谢这里的帮助。

【问题讨论】:

    标签: ruby-on-rails-4 activemodel


    【解决方案1】:

    澄清一下,我想您是在问为什么您甚至无法设置 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 一段时间,直到它落地,然后再回到发布的版本。

    【讨论】:

    • 感谢您的回复@carols10cents。你对周围的工作有什么想法吗?现在,我实际上正在使用一个选择,每个选择具有不同的日期、月份和年份名称。然后覆盖 before_validation 将它们连接在一起成为一个新的日期类型对象。你怎么看?
    • 这个答案太棒了!
    • 很好的答案!正是我需要知道的。在我们等待 PR 合并的过程中,有没有人提出任何实际的解决方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2018-10-06
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多