Rails 3 与composed_of 模型和验证

2024-01-12

我有这个域模型:

class Person < ActiveRecord::Base
  composed_of :address,
              mapping: [%w(address_street street), %w(address_city city), %w(address_zip_code zip_code), %w(address_country country)]

  validates :name, presence: true, length: { maximum: 50 }
  validates :surname, presence: true, length: { maximum: 50 }

  validates_associated  :address
end

class Address
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_reader :street, :city, :zip_code, :country

  validates :street, presence: true
  validates :city, presence: true
  validates :zip_code, presence: true
  validates :country, presence: true

  def initialize(street, city, zip_code, country)
    @street, @city, @zip_code, @country = street, city, zip_code, country
  end

  def ==(other_address)
    street == other_address.street && city == other_address.city && zip_code == other_address.zip_code && country == other_address.country
  end

  def persisted?
    false
  end
end

当我尝试保存无效模型时:

> p = Person.new
=> #<Person id: nil, name: nil, surname: nil, address_street: nil, address_city: nil, address_zip_code: nil, address_country: nil
> p.valid?
=> false
> p.errors
=> {:name=>["can't be blank"], :surname=>["can't be blank"], :address=>["is invalid"]}

这没问题,但我更喜欢用 Address 的错误消息填充错误数组,如下所示:

=> {:name=>["can't be blank"], :surname=>["can't be blank"], :address_street=>["can't be blank"], :address_city=>["can't be blank"], :address_zip_code=>["can't be blank"], :address_country=>["can't be blank"]}

问题是:是否有一种干净的 Rails 方法可以做到这一点?或者只是我必须将验证代码从地址移至人员(相当难看)?还有其他解决方案吗?

非常感谢。


当你定义一个composed_of属性,它本身就成为一个对象。我看到有两种方法可以满足您的需求。

1)在您的中添加错误消息Address class

将当前的验证替换为:

validates_each :street, :city, :zip_code, :country do |record, attr, value|  
  record.errors.add attr, 'should not be blank' if value.blank?
end

这样,您将能够访问执行以下操作的错误消息:

p = Person.new
p.address.errors

2) 仅定制address错误信息

validates_associated  :address, 
                      :message => lambda { |i18n_key, object| self.set_address_error_msg(object[:value]) }

def self.set_address_error_msg address
  errors_array = Array.new
  address.instance_variables.each do |var|
    errors_array << "#{var[1..-1]} should not be blank" if address.send(var[1..-1]).blank?
  end
  errors_array.join(", ")
end       

这会呈现类似:

=> #<OrderedHash {:address=>["country should not be blank, zip_code should not be blank, validation_context should not be blank, city should not be blank"]}> 

最后,您可以在您的中重写验证器Profile类,但正如你所说,它真的很难看。

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

Rails 3 与composed_of 模型和验证 的相关文章

随机推荐

  • 跨多个文件的 Javascript 中的全局变量

    我的一堆 JavaScript 代码位于名为 helpers js 的外部文件中 在调用此 JavaScript 代码的 HTML 中 我发现自己需要知道是否调用了 helpers js 中的某个函数 我试图通过定义创建一个全局变量 var
  • Log4J:警告无法为 Logger 错误找到 Appender

    下面是我的log4j properties文件内容 文件与eclipse中的src文件夹放在一起 Application Logs log4j rootlogger INFO logg log4j appender logg org apa
  • Facebook 应用程序是使用 PhoneGap 或 Appcelerator 等移动开发框架构建的吗?

    我发现了numerous http venturebeat com 2011 07 08 hybrid mobile apps take off as html5 vs native debate continues sources htt
  • node.js http.get 在对远程站点发出 5 次请求后挂起

    我正在编写一个简单的 api 端点来确定我的服务器是否能够访问互联网 它工作得很好 但是在 5 个请求之后 每次都是 5 个 请求就会挂起 当我将 Google 切换到 Hotmail com 时 也会发生同样的情况 这让我觉得这是我的事情
  • 从另一个应用程序启动时,应用程序将失去记住其堆栈的能力

    现在我已经对此进行了更多研究 我写这篇文章是为了让它更清楚 如果您正在寻找更多信息 可以在旧版本中找到一些信息 怎么了 这是指没有设置任何launchMode的应用程序 设置 因此使用默认值 您可以从市场或安装程序启动应用程序 这 启动应用
  • 将特定风格的依赖关系与维度链接起来

    我正在开发一个 Android 应用程序 它有两种类型 免费和付费 每层都有 2 个版本 轻型和重型 这是 Gradle 的实现 flavorDimensions tier distro productFlavors free dimens
  • Java 10:替换 java.xml.ws 冲突

    我必须使用java xml ws 我的项目中包含一些组件 但因为它已被弃用并且很快就会被删除 所以我想使用这些组件的替代品 所以我将此依赖项添加到我的项目中pom file
  • 如何从 Dart 的 List 中获取随机元素?

    如何从 Dart 集合中检索随机元素 var list a b c d e import dart math var list a b c d e generates a new Random object final random new
  • 为什么一个字节只有0到255?

    为什么一个字节的范围只有0到255 严格来说 术语 字节 实际上可以指具有 256 个值以外的单元 只不过是这样而已几乎普遍尺寸 从维基百科 http en wikipedia org wiki Byte 从历史上看 一个字节是 用于编码单
  • 错误 c4996 检查迭代器

    我使用 VC 2013 我有以下代码 pragma warning disable 4996 define D SCL SECURE NO WARNINGS include
  • LinqToSql 和 WCF

    在使用 WCF 服务与数据库交互的 n 层应用程序中 在整个应用程序中使用 LinqToSql 类的最佳实践方法是什么 我见过它以几种不同的方式完成 但它们似乎花费了大量时间来创建额外的接口 消息类等 这减少了您无需编写数据访问代码而获得的
  • 一次按多个键让我的角色沿对角线移动

    我遇到的问题是 当用户按下 K UP 键和 K RIGHT 键或 K UP 键和 K DOWN 键等时 我试图使我的角色在屏幕上对角移动 这是我的角色移动代码 事件处理 1 Event Handling 2 for event in pyg
  • 无法加载文件或程序集“ServiceStack”或其依赖项之一。该系统找不到指定的文件

    我试图将我的网络应用程序启动到服务器 Server Windows Server 2008 R2 企业版 IIS版本 7 5 框架版本 4 0 30319 17929 但出现以下错误 Server Error in salavirtual
  • 绑定转换器参数

    有没有办法我可以做到这一点Style
  • jQuery 克隆链接选择

    我刚刚开始 http jsfiddle net FJFFJ 1 http jsfiddle net FJFFJ 1 by 使用 JQuery 链接动态创建的下拉菜单 https stackoverflow com q 5545229 151
  • 如何开始使用 ARM 处理器?

    对于新手来说 是否建议直接从 ARM 处理器的数据表和用户手册开始 或者先了解 ARM 世界然后再继续 当我开始使用一项新的 对我来说 技术时 我首先会找到尽可能多的数据表和应用说明 然后直接阅读它们 第一个目标是快速了解该技术特有的术语
  • 打印 $_POST 变量名称和值

    我在 PHP 中有一个 POST 我并不总是知道要处理的变量字段的名称 我有一个函数可以循环遍历这些值 但是我也想捕获与之相关的变量名称 foreach POST as entry print entry br 一旦我弄清楚如何获取变量名称
  • 通过 LoadLibrary 调用 DLL 时 MFC 状态无效

    我正在与 MFC 进行斗争 并使用 LoadLibrary 动态链接 DLL 当应用程序调用DLL并且DLL在同一调用中回调时 我似乎无法正确获取MFC状态 最终 它导致了大量的断言 这是我正在做的事情的代码模型 该应用程序很正常 直接来自
  • 从 webAudio / mozAudio 获取原始 PCM 数据

    我正在尝试保存 webAudio API 的输出以供将来使用 到目前为止 我认为获取 PCM 数据并将其保存为文件将满足我的期望 我想知道 webAudio 或 mozAudio 是否已经支持保存输出流 如果不支持怎么办我从输出流获取pcm
  • Rails 3 与composed_of 模型和验证

    我有这个域模型 class Person lt ActiveRecord Base composed of address mapping w address street street w address city city w addr