Model 创建嵌套模型-Rails 3.1

Model 创建嵌套模型-Rails 3.1,model,ruby-on-rails-3.1,Model,Ruby On Rails 3.1,我试图同时创建3个嵌套模型,但在验证时遇到了问题 这些是我的模型: class UserEntity < ActiveRecord::Base has_many :users, :dependent => :restrict, :autosave => true end class User < ActiveRecord::Base has_many :user_login_services, :dependent => :

我试图同时创建3个嵌套模型,但在验证时遇到了问题

这些是我的模型:

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
这段代码似乎运行良好,并在所有3个表中创建了适当的条目。当我在UserLoginService中取消注释“validates:user_id,:presence=>true”时会出现问题,这会让我

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\u login\u services表中的user\u id设置为正确的值


为什么会出现此错误,以及如何解决此问题?

您需要为和关系的接受嵌套属性和反向属性进行定义

class UserEntity < ActiveRecord::Base
  has_many   :users, :dependent => :restrict, :autosave => true, :inverse_of => :users_entity
  accepts_nested_attributes_for :users
end

class User < ActiveRecord::Base
  has_many    :user_login_services, :dependent => :destroy, :autosave => true, :inverse_of => :user
  belongs_to  :user_entity, :inverse_of => :users
  accepts_nested_attributes_for :user_login_services
end

class UserLoginService < ActiveRecord::Base
  belongs_to :user, :inverse_of => :users_login_services
  validates :user, :presence => true 
end
class-UserEntity:restrict,:autosave=>true,:inverse\u of=>:users\u实体
接受用户的\u嵌套\u属性\u
结束
类用户:destroy,:自动保存=>true,:反转=>:user
属于:user\u实体,:inverse\u of=>:users
接受用户登录服务的嵌套属性
结束
类UserLoginService:用户\u登录\u服务
验证:user,:presence=>true
结束
我还将
validates:user\u id
切换到
validates:user
,假设您想验证关联的
user
的存在,而不仅仅是
UserLoginService
具有
用户id

,简而言之:

在您的模型中

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
以你的形式

<%= 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 %>


此外,我建议您查看:

非常感谢,请指定“为我做了这件事”的相反名称!否则,在保存Rails时,将首先尝试保存嵌套模型(嵌套模型属于顶层模型),但由于顶层模型尚未创建,因此该操作将失败。
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 %>