I'm on Rails 3.2.8 and Ruby 1.9.3.
I'm having trouble figuring out why the validations on the nested attributes are not being run or returning any errors. When I submit the form with nothing filled in, I get errors back for the parent model (User), but not for the child model (Account).
In my code below, I have a User model which has_one owned_account (Account model), and an Account model that belongs_to an owner (User model). The Account model has a text field for a subdomain string.
It seems that when I submit the form without including the subdomain field, the validations on the Account model are not run at all. Any ideas on how I can get the validations here working? Thanks in advance for any help or pointers.
user.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
account.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
new.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
You need to add the accepts_nested_attributes_for
method to the User model. Like so:
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
Then you should see validation errors pertaining to the nested model on the parent model (User):
["Owned account subdomain can't be blank", "Owned account is invalid"]
EDIT
The culprit turned out to be the :reject_if
bit in the accepts_nested_attributes_for
line that effectively instructed Rails to ignore nested account objects if the subdomain attribute was blank (see discussion in comments)
It looks like the nested form is generating fields for owned_account_attributes, which is not an association, instead of owned_account. Have you tried doing a User.create with nested attributes on the rails console to see if it works there?
来源:https://stackoverflow.com/questions/12272727/rails-validations-are-not-being-run-on-nested-model