3

我在 Rails 3.2.8 和 Ruby 1.9.3 上。

我无法弄清楚为什么嵌套属性的验证没有运行或返回任何错误。当我提交未填写任何内容的表单时,我会收到父模型(用户)的错误,而不是子模型(帐户)的错误。

在下面的代码中,我有一个拥有一个拥有的帐户(帐户模型)的用户模型和一个属于所有者的帐户模型(用户模型)。Account 模型有一个子域字符串的文本字段。

似乎当我提交不包含子域字段的表单时,帐户模型上的验证根本没有运行。关于如何在这里进行验证的任何想法?提前感谢您的任何帮助或指示。

用户.rb

class User < ActiveRecord::Base
  attr_accessible :owned_account_attributes
  has_one :owned_account, :class_name => 'Account', :foreign_key => 'owner_id'

  validates_associated :owned_account
  accepts_nested_attributes_for :owned_account, :reject_if => proc { |attributes| attributes['subdomain'].blank? }
end

帐号.rb

class Account < ActiveRecord::Base
  attr_accessible :owner_id, :subdomain
  belongs_to :owner, :class_name => 'User'

  validates :subdomain, 
    :presence => true, 
    :uniqueness => true,
    :format => { ...some code... }
end

新的.haml

= form_for @user do |f|
  ... User related fields ...
  = f.fields_for :owned_account_attributes do |acct|
    = acct.label :subdomain
    = acct.text_field :subdomain
  = submit_tag ...

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])

    if @user.save
      ...
    end
end
4

2 回答 2

4

您需要将该accepts_nested_attributes_for方法添加到 User 模型中。像这样:

class User < ActiveRecord::Base
  attr_accessible :owned_account_attributes, # other user attributes 
  has_one :owned_account, :class_name => 'Account', :foreign_key => 'owner_id'

  accepts_nested_attributes_for :owned_account
  validates_associated :owned_account
end

然后您应该看到与父模型(用户)上的嵌套模型有关的验证错误:

["Owned account subdomain can't be blank", "Owned account is invalid"]

编辑

罪魁祸首是在子域属性为空时有效地指示 Rails 忽略嵌套帐户对象:reject_ifaccepts_nested_attributes_for那一行(参见评论中的讨论)

于 2012-09-05T03:57:44.337 回答
0

看起来嵌套表单正在为owned_account_attributes 生成字段,这不是关联,而不是owned_account。您是否尝试过在 Rails 控制台上使用嵌套属性执行 User.create 以查看它是否在那里工作?

于 2012-09-05T19:48:10.147 回答