创建嵌套模型-Rails 3.1 [英] Creating nested models - Rails 3.1

查看:76
本文介绍了创建嵌套模型-Rails 3.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试一次创建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中的'validate: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

Additionally I recommend you check out: http://railscasts.com/episodes/196-nested-model-form-part-1

这篇关于创建嵌套模型-Rails 3.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆