Rails validates_presence_of 并验证 has_one 关联模型中的存在

Posted

技术标签:

【中文标题】Rails validates_presence_of 并验证 has_one 关联模型中的存在【英文标题】:Rails validates_presence_of and validates presence in has_one associated models 【发布时间】:2013-08-28 07:38:22 【问题描述】:

我无法将对象保存到相应的表中。

模型客户。我想确保它有一个关联的有效帐户:

has_one :account, dependent: :destroy
validates_presence_of :account
validates_associated :account

模型帐户属于客户,所以我想强制 customer_id 存在:

belongs_to :customer
validates :customer_id, presence: true

现在,我的问题是:我应该按什么顺序保存这些对象?这些验证是否有些不兼容?

因为,如果我先尝试保存客户,这是不可能的,我会得到

myCustomer.save.errors.messages
:account=>["can't be blank"]

显然,既然我说了

validates_presence_of :account

在模型中。

但如果我先尝试保存帐户,请稍候!我也救不了!我有

验证:customer_id,存在:true

在我的帐户模型中,我还没有保存任何客户!

所以我也尝试过初始化帐户:

acc = Account.new(acc_attr: foo, acc_attr2: bar)

然后尝试像这样将其设置为客户

Customer.account = acc

但话又说回来,客户不会保存,因为 acc 无效,(因为它没有 customer_id 并且我在 Customer 模型中有 validates_associated :account)

那么,我是否必须放弃任一模型中的一次验证?有解决办法吗?

谢谢!

【问题讨论】:

【参考方案1】:

您可以将其添加到您的模型中:

attr_accessible: :customer_id

并添加到 GemFile:

gem 'devise', '3.0.0.rc' 
gem 'protected_attributes'
在终端中运行:$ bundle install 重置服务器

你应该检查你的控制器:

params.require(:account).permit(:customer_id)

【讨论】:

我需要设计什么?另外,我还没有控制器。我只想保存这些对象。 使用attr_accessible: :customer_id 访问数据库。并且设计用于 attr_accessible。控制器是一个选项,如果您的模型没有任何控制器,则不需要签入控制器。 Rails 4 uses strong parameters。 attr_accessible 已被弃用,如 here 所述。 This SO answer 很好地描述了强大的参数如何代替 attr_accessible

以上是关于Rails validates_presence_of 并验证 has_one 关联模型中的存在的主要内容,如果未能解决你的问题,请参考以下文章

Rails:电子邮件“deliver_”方法的自定义模板?

禁用 Rails 4 的 ActiveRecord

应用程序错误:Heroku,Ruby on Rails 4,警告:rails_12factor,vendor / bundle,no Procfile

如何使用Rails中的Mobility gem以一种形式实现所有翻译? [关闭]

Rails - 设计和行为_as_audited

我的 rails 嵌套模型无法识别 _destroy 属性