2012-03-15 28 views
2

我有两个型号:用户教师的Rails 3 - 正确的方式给ID为belongs_to的模型

class User < ActiveRecord::Base 
    attr_accessor :password                
    attr_accessible :user_login,               
        :user_role, 
        :password, 
        :teacher_attributes 

    has_one :teacher 
    accepts_nested_attributes_for :teacher             
end 

# Table name: teachers 
# 
# id     :integer   not null, primary key 
# user_id    :integer 
# teacher_last_name :string(255) 
# teacher_first_name :string(255) 
# teacher_middle_name :string(255) 
# teacher_birthday :date 
# teacher_sex   :string(255) 
# teacher_category :string(255) 
# created_at   :datetime 
# updated_at   :datetime 

class Teacher < ActiveRecord::Base 
    attr_accessible :teacher_last_name, 
        :teacher_first_name, 
        :teacher_middle_name, 
        :teacher_birthday, 
        :teacher_sex, 
        :teacher_category 

    belongs_to :user 
end 

我也有我的控制器的方法,它应该创建用户,然后新教师。但不能正常工作,因为我没有通过id那里。

我控制器

class AdminsController < ApplicationController 
    def create_teacher 
    user_errors, teacher_errors, redirect_path = nil, nil, nil 

    params[:user][:user_role] = "teacher" 
    user = User.new(params[:user])       #Problem is here 

    if user.save 
     redirect_path = admins_users_of_system_path 
     flash[:success] = "Teacher created!" 
    else 
     redirect_path = admins_new_teacher_path 
     user_errors = user.errors.full_messages.to_sentence          
     teacher_errors = user.teacher.errors.full_messages.to_sentence if user.teacher 
    end 

    errors_arr = [user_errors, teacher_errors].compact 
    flash[:error] = errors_arr if errors_arr.present? 
    redirect_to redirect_path 
    end 
end 

我在控制器这样的代码,因为我想抓住从用户和老师的所有错误。

错误

["Teacher user can't be blank", "User can't be blank"] 

utf8: ✓ 
authenticity_token: Hsw9BGOMb37cku6R2aAZsXkYaU5DFZqlUML4yZjqxI0= 
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    teacher_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    teacher_last_name: Popov 
    teacher_first_name: Igor 
    teacher_middle_name: Yurevich 
    teacher_sex: m 
    teacher_birthday: 28.08.1991 
    teacher_category: Something 1 
    user_login: schoolh_MXWTQ 
    password: eviRDyalXnHlK6q 
    user_role: teacher 
commit: Создать 
controller: admins 
action: create_teacher 

我怎样才能建立一个老师和在同一时间正确的用户?我应该如何传递它一个ID?

+0

你有什么错误?你的观点是什么样子? – 2012-03-15 13:23:07

+0

在我的文章中添加了错误文字。 – ExiRe 2012-03-15 13:26:30

+0

您是否从现有用户创建教师?或者你也在这里创建用户?我的意思是,是否将用户转变为老师? – 2012-03-15 13:33:55

回答

1

一个不同的方法是在第一轮简单创建用户,包括老师的角色。然后,管理员填写第二个表单,其中包含个人资料详细信息,如果您愿意(教师模型仍会包含此信息)填写“填写个人资料”。

无论哪种方式,您都可能需要使用delegates_to方法来访问方法http://apidock.com/rails/v3.1.0/Module/delegate

另外,无论你做了什么,你都可以考虑把attr_accessible留在外面,直到事情正常工作。

但是,如果你找到一种方法来同时创建它们,我会第一个复制你!

+0

嗷!你有两种不同形式的方式是有道理的!我认为有一种简单的方法可以一次保存2个模型...无论如何,感谢您的帮助! – ExiRe 2012-03-15 14:26:42

+0

好,谢谢你!你把我撞到了两个新的私有银行。但是......我真的很想知道如何去做你正在尝试的东西!我希望老师能够注册并同时添加教师特定的信息,因为我也有学生用户。 – 2012-03-15 14:37:53

+1

我想,我发现如何做到这一点。我可以与你分享我的结果。如果你愿意,你可以写信给我。 – ExiRe 2012-03-15 17:58:28

0

我觉得prob是params你给错了。 正确的做法应该是:PARAMS [:用户] [ 'USER_ROLE'] = “老师”

+0

我认为这不是一个错误。:) – ExiRe 2012-03-15 13:23:29

+0

一旦我遇到这个错误,而我改为params [:user] ['user_role'] =“老师”,它works.just经验。 – hlcfan 2012-03-15 13:25:10

+0

无论如何谢谢你! – ExiRe 2012-03-15 13:31:18

0

编辑: 正如我在评论说:

尝试:

user = User.create(params[:user]) 

代替User.new

+0

据我所知,'user = User.new(params [:user])'应该创建一个老师,因为它可以访问用户模型中的'teacher_attribute'。问题是我不知道如何正确地为老师添加user_id。 – ExiRe 2012-03-15 13:30:32

+0

用户在保存之前没有ID。林不知道它如何与可访问,但你不包括user_id在老师 – Albin 2012-03-15 13:34:35

+1

可访问属性列表我想也许你应该使用User.create(PARAMS),而不是User.new(PARAMS), 我认为它可以节省这就是他们如何做到这一点 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html – Albin 2012-03-15 13:37:41

相关问题