【问题标题】:ActiveRecord validation not workingActiveRecord 验证不起作用
【发布时间】:2015-12-31 14:02:21
【问题描述】:

我创建了 Rails ActiveRecord 验证,当它被违反时,没有记录被保存(实际上,我相信它正在被保存,然后正在执行 ROLLBACK,如控制台输出所示)。

但是,我没有再次被重定向到新表单并显示我添加的错误消息,而是被发送到索引页面(没有创建新记录,这是正确的,但我想要其他行为)。

我认为这是一件愚蠢的事情,与回滚有关(就像正在保存记录,这就是我被重定向到索引页面的原因,但是回滚完成了 - 不知道为什么,并且没有记录保存)。知道如何解决这个问题吗?

我创建了以下验证:

  # Adds an error if the replacement date is in the future
  def replacement_date_is_not_future
    unless replacement_date.blank? or replacement_date <= Date.today
      errors.add(:replacement_date, :date)
    end
  end

在我的模型的头部,我有以下内容:

  validate :replacement_date_is_not_future

这是我的控制器方法:

  def create
    @device_replacement = DeviceReplacementForm.new(replacement_params)

    if @device_replacement.save
      redirect_to device_replacements_path
    else
      render 'new'
    end
  end

这是我的控制台输出:

Started POST "/device_replacements" for 127.0.0.1 at 2015-12-31 10:48:09 -0300
Processing by DeviceReplacementsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"MbR2lXp5ujSNILEKC2ROhij3+yNpIL3ymEdZxJejSxc=", "device_replacement_form"=>{"old_esn"=>"2-3021325", "new_esn"=>"DEMO-0-648340", "replacement_date"=>"2016-01-03"}, "commit"=>"Create"}
  RackCAS::ActiveRecordStore::Session Load (0.9ms)  SELECT  "sessions".* FROM "sessions"  WHERE "sessions"."session_id" = '0ee02a1bcbc8548e172d511c02b97490'  ORDER BY "sessions"."id" ASC LIMIT 1
  Device Load (1.1ms)  SELECT  "devices".* FROM "devices"  WHERE "devices"."esn" = '2-3021325' LIMIT 1
  Device Load (1.6ms)  SELECT  "devices".* FROM "devices"  WHERE "devices"."esn" = 'DEMO-0-648340' LIMIT 1
   (0.3ms)  BEGIN
   (0.5ms)  SELECT "devices"."asset_id" FROM "devices"  WHERE "devices"."id" = 81265
   (0.3ms)  ROLLBACK
Redirected to http://localhost:3000/device_replacements
Completed 302 Found in 93ms (ActiveRecord: 14.8ms)
  RackCAS::ActiveRecordStore::Session Load (1.9ms)  SELECT  "sessions".* FROM "sessions"  WHERE "sessions"."session_id" = '0ee02a1bcbc8548e172d511c02b97490' LIMIT 1
   (0.3ms)  BEGIN
   (0.4ms)  COMMIT

【问题讨论】:

  • 我没有看到任何记录被保存到数据库中。行为似乎正确。
  • 但显然 if 条件 (@device_replacement.save) 为真,这就是重定向到索引页面的原因。但是由于回滚,没有显示任何记录。有意义吗?
  • 你可以使用像 byebug 这样的调试器。它会停止执行并让您在创建操作中播放。
  • @MaiteMañana 不,此路径正用于render 'new' 操作。只需在渲染前在else 中添加puts 'NOT SAVED',您就会看到
  • 您使用 "2016-01-03" 作为 replacement_date - 这意味着验证确实通过了。

标签: ruby-on-rails ruby validation rails-activerecord


【解决方案1】:

看起来你的代码很好,问题是它不在正确的位置。尝试查看是否有另一个模型负责在该视图中创建 device_replacement。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2011-10-02
    • 1970-01-01
    • 2013-02-06
    • 2018-06-19
    相关资源
    最近更新 更多