- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Rails 3.0.5,我为我的模型进行了自定义验证,当我创建或更新容器记录时,验证有效地执行并在必要时添加错误,但记录仍然存在保存在数据库中。
我已经测试了自定义验证方法的每一步并且工作正常。
这是我的模型和自定义验证:
class Container < ActiveRecord::Base
include Comparable
belongs_to :booking
validates :booking, presence: true
validates :kind, presence: true
validates :dimension, presence: true, numericality: { only_integer: true }
validates :retirement_location, presence: true
validates :amount, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 1 }
validate :uniqueness_of_single_fields
scope :group, lambda {|k,d| where('kind = ? and dimension = ?',k,d) }
def self.to_hash
{
"kind" => self.kind.to_s,
"dimension" => self.dimension.to_s,
"retirement_location" => self.retirement_location.to_s
}
end
def uniqueness_of_single_fields
similar_containers = Container.joins(:booking).where('bookings.requirement_id = ? and containers.id != ?', booking.requirement.id, id)
similar_containers = similar_containers.where(assigned_unit: assigned_unit, assigned_seal: assigned_seal)
unless similar_containers.empty?
errors.add(:base, "esa unidad y sello ya han sido asignados")
end
end
def <=>(other)
result = kind <=> other.kind
result == 0 ? dimension <=> other.dimension : result
end
end
附言我检查过以前的问题,但没有一个能回答这个问题
我做了一个 rspec 测试来试试这个
require 'spec_helper'
describe Container do
it 'should have a uniq combination assigned unit and seal for in a requirement' do
requirement1 = Factory(:requirement, reference: 'abc123')
requirement2 = Factory(:requirement, reference: 'qwerty')
booking1 = Factory(:booking, reference: 'FOOBAR123', requirement: requirement1)
booking2 = Factory(:booking, reference: 'FOOBAR456', requirement: requirement1)
booking3 = Factory(:booking, reference: 'FOOBAR789', requirement: requirement2)
container1 = Factory(:container, assigned_unit: 'foo1', assigned_seal: 'bar1', booking: booking1)
container2 = Factory.build(:container, assigned_unit: 'foo1', assigned_seal: 'bar1', booking: booking2)
container3 = Factory(:container, assigned_unit: 'foo1', assigned_seal: 'bar1', booking: booking3)
container1.should be_valid
container3.should be_valid
puts container2.errors
container2.save
puts container2.inspect
container2.should_not be_valid
puts container2.errors.inspect
container2.errors[:base].first.should == "esa unidad y sello ya han sido asignados"
c = Requirement.new(client: 'foo')
c.save
puts c.errors
puts c.inspect
end
end
输出是:(当它应该失败时它通过了)
{}
#<Container id: 6, kind: "dry", dimension: 20, retirement_location: "sitrans", booking_id: 5, created_at: "2011-03-28 22:31:13", updated_at: "2011-03-28 22:31:13", load: "wine 2", assigned_unit: "foo1", assigned_seal: "bar1", temp_celsius: nil, temp_fahrenheit: nil, vent_percentage: nil, vent_cfm: nil, generator: nil, amount: 1>
{:base=>["esa unidad y sello ya han sido asignados"]}
{:service=>["Debe elegir un tipo de servicio"], :shipping_company=>["Debe haber una naviera relacionada con esta orden de servicio"]}
#<Requirement id: nil, client: "foo", service_id: nil, realization: nil, hour: nil, shipping_company_id: nil, description: nil, created_at: nil, updated_at: nil, reference: nil, state: "new">
.
Finished in 0.45293 seconds
1 example, 0 failures
最佳答案
我认为您很接近,但您一直在阅读片段而不是教程或文档。如果您引用 Railscast Episode On Rails3 Validations ,然后您会看到他们建议定义您自己的自定义验证器子类,而不是将另一个函数粘贴到您的模型上。
您可能会说不需要抽象只是因为它“更合适”或类似的东西?然后查看 API doc for Validations
在这里,他们说“最小的实现”是这样的:
class Person
include ActiveModel::Validations
attr_accessor :first_name, :last_name
validates_each :first_name, :last_name do |record, attr, value|
record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
end
end
或
class Person
include ActiveModel::Validations
validates :instance_validations
def instance_validations
validates_with MyValidator
end
end
最重要的是 API entry for the validates
method ,他们甚至建议您在类/模型中定义自定义验证器类:
class Film
include ActiveModel::Validations
class TitleValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors[attribute] << "must start with 'the'" unless value =~ /\Athe/i
end
end
validates :name, :title => true
end
干杯!
关于database - 即使自定义验证失败 Rails 3 也会保存记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5463442/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!