问题描述
我正在尝试一次创建 3 个嵌套模型,但在验证时遇到问题.
I am trying to create 3 nested models at once, and have trouble with my validations.
这些是我的模型:
class UserEntity < ActiveRecord::Base
has_many :users, :dependent => :restrict, :autosave => true
end
class User < ActiveRecord::Base
has_many :user_login_services, :dependent => :destroy, :autosave => true
belongs_to :user_entity
end
class UserLoginService < ActiveRecord::Base
belongs_to :user
#validates :user_id, :presence => true
end
(UserEntity 可以是一家公司,有很多用户.UserLoginService 用于 Omniauth 服务,例如 Facebook、openID 等)
(UserEntity can be a company, with many users. UserLoginService is used for Omniauth services such as Facebook, openID, etc.)
用户是用
def new_user_login(tokens)
user_entity = UserEntity.new
user = user_entity.users.build(:email => tokens[:email], :password => Devise.friendly_token[0,20], :first_name => tokens[:first_name], :last_name => tokens[:last_name], :has_local_password => false)
user.skip_confirmation!
user.user_login_services.build(:provider => tokens[:provider], :uid => tokens[:uid], :uname => tokens[:name], :uemail => tokens[:email])
user_entity.save!
user.confirm!
此代码似乎工作正常,并在所有 3 个表中创建了适当的条目.当我在 UserLoginService 中取消注释 'validates :user_id, :presence => true' 时出现问题,这让我
This code seems to be working fine, and creates appropriate entries in all 3 tables. The problem occurs when I uncomment 'validates :user_id, :presence => true' in UserLoginService, which gets me
ActiveRecord::RecordInvalid (Validation failed: Users user login services user can't be blank):
app/controllers/users/omniauth_callbacks_controller.rb:86:in `new_user_login'
请注意,代码在没有验证的情况下似乎可以正常工作,并且 user_login_services 表中的 user_id 设置为正确的值.
Note that the code seems to be working fine without the validation, and user_id in the user_login_services table is set to the proper value.
为什么我会收到这个错误,我该如何解决?
Why am I getting this error, and how do I solve this?
推荐答案
简而言之:
在你的模型中
class UserEntity < ActiveRecord::Base
has_many :users
accepts_nested_attributes_for :users
end
class User < ActiveRecord::Base
belongs_to :user_entity
has_many :user_login_services, :dependent => :destroy
accepts_nested_attributes_for :user_login_services
end
class UserLoginService < ActiveRecord::Base
belongs_to :user
validates :user_id, :presence => true
end
在你的控制器中
def create
@user_entity = UserEntity.new(params[:user_entity])
@user_entity.save
# To Do: handle redirections on error and success
end
并以您的形式
<%= form_for(@user_entity) do |f| %>
<%= f.fields_for :users do |u| %>
<%= u.fields_for :user_login_services do |ul| %>
<%= ul.select :user_id, @user_entity.users.collect{|u| [u.name, u.id]} %>
<% end %>
<% end %>
<% end %>
此外,我建议您查看:http://railscasts.com/episodes/196-nested-model-form-part-1
这篇关于创建嵌套模型 - Rails 3.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!