错误不会阻止对象保存吗?

2024-04-27

我有一个虚拟属性,它从表单字段获取时间范围并将其分割:

def time_range=(time_range)
  unless time_range.empty?
    t = time_range.split(/to|\-/)
    self.start_entry = t[0]
    self.finish_entry = t[1]
    if Chronic.parse(self.start_entry).nil? || Chronic.parse(self.finish_entry).nil?
      errors.add(:time_range, 'Invalid time range entered')
    end
  end
end

start_entry and finish_entry也是虚拟属性,因为我有其他方法来设置它们。无论两者如何设置,我都需要设置以下钩子start and finish在我的数据库中:

before_save :set_start_and_finish

尽管我添加了一个错误,但错误的对象仍然设法保存:

> t = Tour.new
> t.time_range = "rubbish"
> t.errors
#=> {:time_range=>["Invalid time range entered"]}
> t.valid?
#=> true

如何使实例无效以防止稍后保存?


Calling t.valid?将在运行验证之前清除错误,以便您在其中进行验证time_range=被忽略。

如果我们看一下ActiveRecords 的valid? https://github.com/rails/rails/blob/4-0-stable/activerecord/lib/active_record/validations.rb#L68,我们看到这个:

def valid?(context = nil)
  context ||= (new_record? ? :create : :update)
  output = super(context)
  #...

超级应该送你进入活动模型的valid? https://github.com/rails/rails/blob/4-0-stable/activemodel/lib/active_model/validations.rb#L311它是这样开始的:

def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  #...

and the clear调用 nukes 您添加的错误time_range=.

如果您想验证某些内容,请使用验证器。如果您想防止无效分配,请提出参数错误 http://www.ruby-doc.org/core/classes/ArgumentError.html(或其他更合适的例外)。

让验证系统自行重置(即errors.clear)在运行验证之前确实有意义。如果它没有重置,您就必须丢弃并重新加载无效对象(或手动重置它)才能纠正验证错误。仅仅因为“更新、验证、保存或销毁”是 Web 应用程序的一般工作流程,并不意味着它是数据库支持的应用程序唯一可能的工作流程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误不会阻止对象保存吗? 的相关文章

  • 如何用另一个子字符串替换子字符串(按索引 from..to)

    如何用其他字符串将某个字符中的子字符串替换为另一个字符 first 4 last 11 replacement show me the money replace part first last replacement gt show mo
  • Rails 命名空间与嵌套资源

    假设我的应用程序有两个模型 Foo 和 Bar Foo 可选地属于 Bar 现在我可以查看单个 Foo 或者搜索特定的 Foo FoosController 会处理所有这些 我的网址是这样的 foos 1 and foos new 有时我想
  • 用户在 Rails 中选择 CSS 样式表

    我正在 Rails 中开发一个网站 我希望用户能够将 CSS 样式表更改为浅色或深色主题 我认为这样我就可以为样式表使用变量 我尝试通过在我的视图中添加一个链接来更改该变量 如下所示 在我的控制器中调用此函数 class ProjectsC
  • 在 OS X 10.7.4 上安装 RSRuby 时找不到库

    我正在尝试在我的 Mac 上安装 RSRuby 调用后 sudo gem install rsruby 我收到此错误 ERROR Cannot find the R library aborting extconf rb failed Co
  • 如何在rescue_from中渲染500页

    我想在我的应用程序出现异常时发送电子邮件并呈现常规 500 页 我找不到如何执行 500 页渲染 class ApplicationController lt ActionController Base rescue from Standa
  • gem 如何提供 Cucumber 功能和步骤定义?

    我有两个 Rails 项目 A 和 B 其中包含以下宝石 project A gem green theme path gt dev themes green theme gem devel tasks path gt dev themes
  • 授予 Rails 应用 API 访问权限的最佳身份验证方法

    我想为我的网络应用程序提供经过身份验证的 API 访问 此类服务的消费者通常是其他网站 服务 验证这些用户身份的最佳方法是什么 OAuth openID http 身份验证 正如我们的工作一样 哪个最好 的答案是这样的 是 这取决于 HTT
  • 使用 Rails 自动登录?

    我正在尝试使用 Rails 的 Restful Authentication 插件建立一个简单的身份验证系统 我只是想知道它是如何工作的 b c 我似乎无法弄清楚 cookie 的要求是什么 以及如何做到这一点浏览器始终会记住您 6 个多月
  • 黄瓜和 Rspec

    任何人都可以向我推荐黄瓜和 rspec 教程 rails 3 的好来源 简单示例 吗 Edit 实际上我正在寻找带有很好示例的免费在线资源 我觉得R规格书 http www pragprog com titles achbd the rsp
  • Ruby - 乘法问题

    我的输出是这样的 ruby 1 9 2 p290 011 gt 2 32 3 gt 6 959999999999999 我记得有一天在另一台机器上我得到了它就像 2 32 3 6 我的错误是什么 非常感谢您阅读本文 如果您确实想向下舍入为整
  • 机架 1.3.2 的问题。您已经激活了机架 1.3.2,但您的 Gemfile 需要机架 1.2.3

    我在 Debian 上有 Passenger 3 0 9 带有 Gem Rack 1 3 2 和 1 2 1 使用带有乘客 e 捆绑器的 Rails 3 0 应用程序 我遇到以下错误 您已经激活了机架 1 3 2 但您的 Gemfile 需
  • Ruby—Open3.popen3 / 如何打印输出

    我有一个小红宝石脚本 它的作用是mysql导入方式 mysql u
  • Rails 4.0 expire_fragment/缓存过期不起作用

    我一直在尝试使用 Rails 的缓存功能 但我无法使某些缓存片段过期 尽管它们似乎已过期 使用 Rails 教程网站中指出的 Russian Doll Caching 我正在使用此配置 我使release controller rb 控制器
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • Facebook 注册后重定向至页面

    我正在尝试在成功 Facebook 注册 未登录 后重定向用户 我想重定向到 getstarted welcome用户注册后首次 我的omniauth回调是 def facebook You need to implement the me
  • 单表继承发现问题

    我有以下3个rails类 它们都存储在一张表中 使用rails的单表继承 class Template lt ActiveRecord Base class ThingTemplate lt Template class StockThin
  • ActiveAdmin 使用 Devise Rails 登录两次

    我有一个Rails已设置使用的应用程序devise with User模型 我只是添加ActiveAdmin并且它使用单独的型号名称AdminUser 这个新模型也使用了设计 我遇到的问题是 当我去localhost 3000 admin
  • 使用 Assetic PHP 通过 RVM 安装后 Sass 损坏

    我正在尝试设置 Assetic PHP 资源编译器 并且它可以与 CoffeeScript Stylus 和 Less 一起使用 所有 NPM 包都运行良好 然而 对于 Sass 我遇到了问题 以下是我到目前为止所采取的步骤 我安装了 RV
  • 您将如何整理这个控制器逻辑?

    我在控制器中有一些逻辑 如果满足某些条件 它会设置对象的状态 if params concept consulted legal 0 params concept consulted marketing 1 concept attribut
  • Rails 和 Mysql 的毫秒数

    使用 Rails Mysql 时存储时间 以毫秒为单位 的最佳方式是什么 我将使用小数和composed of 以便能够将该值作为Ruby 时间进行操作 有人有更好的主意吗 自从提出这个问题以来 已经过去了好几年了 这是更新的解决方案 ht

随机推荐