Ruby on rails 表单中的日期格式正确,但未通过模型验证

Ruby on rails 表单中的日期格式正确,但未通过模型验证,ruby-on-rails,Ruby On Rails,我试图创建我的CRUD的第一次更新,但我得到了一个奇怪的验证错误。在我看来,有一个字段可以输入日期。它以以下格式到达我的控制器:dd/mm/yyyy 因此,在我的事件控制器上,更新和require_参数如下所示: def update @event = Event.find(params[:id]) puts '----params date----' puts event_params[:date] puts '----params date----'

我试图创建我的CRUD的第一次更新,但我得到了一个奇怪的验证错误。在我看来,有一个字段可以输入日期。它以以下格式到达我的控制器:dd/mm/yyyy

因此,在我的事件控制器上,更新和require_参数如下所示:

def update
    @event = Event.find(params[:id])
    puts '----params date----' 
    puts event_params[:date]
    puts '----params date----' 
    if @event.update_attributes(event_params)
      flash[:notice] = "Evento atualizado com sucesso."
      redirect_to @event
    else
      @event_count = Event.count
      render('edit')
    end
  end

  private
    def event_params
      params.require(:event).permit(:event, :place, :link, :participants, :date)
    end
和我的事件模型:

# include ER
class Event < ApplicationRecord
    scope    :datedesc, lambda {order("date desc")}

    HUMANIZED_ATTRIBUTES = {
        :date => "Data"
    }

    def self.human_attribute_name(attr, options={})
      HUMANIZED_ATTRIBUTES[attr.to_sym] || super
    end

    validates :event, :place, :link, :participants, :date, presence: true
    validates :event, :place, :link, :participants, length: { maximum: 255 }
    # validates :date, format: {with: ER::DATE, message: "Data fora do padrão", :multiline => true}
    validates :date, format: {:with => /\d{2}\/\d{2}\/\d{4}/, :message => "Data precisa estar no padrão dd/mm/yyyy"}
end

我将在这里回答你的评论。做某事通常没有最好的方法,我建议的方法是如何处理这种情况。 关于ruby中的异常处理,您可以在此处了解:。 有关自定义验证,请阅读:。
您可以将自定义验证和异常处理结合起来解决问题。此外,可以在控制器中通过在begin/rescue子句中包装对象的更新来完成此操作。

Rails.logger可能对此类调试有用,此外,还有一个名为byebug的漂亮gem。如果您想要类似于var_dump的东西,您可能需要尝试对您尝试调试的对象调用inspect方法。感谢您提供有关调试@zilvinas的提示。你知道我的验证过程会发生什么吗?我不确定,我建议做一些我建议的欺骗。可能是event_params方法出了问题。还有一个小提示:验证日期的方式不是最佳做法,因为这个正则表达式规则仍然允许一系列无效日期。相反,除了格式验证之外,我建议添加一个自定义验证块,您可以尝试解析给定的日期,如果解析失败,则返回false。此外,模型中的date属性可能不是字符串,而是datetime对象。在这种情况下,格式并不重要。您只需检查日期是否可以解析(是否有效)。。。但是还没有向我们展示这些。。。你能编辑你的问题并添加到那里吗?还可以考虑:“42/42/9999”将通过您的验证格式,但仍然不是有效日期。但我同意。。。您的日期可以作为已解析的ruby
date
。。。这将无法通过格式验证,但仍然是合法的。因此,我建议仅在
date
字段是字符串时验证格式?
Started PATCH "/admin/events/1" for 127.0.0.1 at 2017-02-23 13:34:13 -0300
Processing by Admin::EventsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZVX7nRd67A0RDlYwcgKRyLLsh4GicmicF7AWB6LWGtnzT4T79GkHk8DJyZLQm2lc4gos1idZ5LYGz37Nv97Wrg==", "event"=>{"event"=>"Evento 1", "place"=>"Rua Teste 123", "link"=>"www.google.com", "participants"=>"Felipe, Fernando, Rodrigo", "date"=>"25/02/2017"}, "commit"=>"Atualizar Evento", "id"=>"1"}
  Event Load (0.0ms)  SELECT  `events`.* FROM `events` WHERE `events`.`id` = 1 LIMIT 1
----params date----
25/02/2017
----params date----
   (0.0ms)  BEGIN
   (0.0ms)  ROLLBACK
   (0.0ms)  SELECT COUNT(*) FROM `events`
  Rendering admin/events/edit.html.erb within layouts/admin
  Rendered admin/events/_form.html.erb (2.0ms)
  Rendered admin/events/edit.html.erb within layouts/admin (39.0ms)
  Rendered admin/_menu.html.erb (1.0ms)
  Rendered admin/_rodape.html.erb (1.0ms)
Completed 200 OK in 257ms (Views: 200.8ms | ActiveRecord: 0.0ms)