2012-03-15 71 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