2012-11-21 69 views
1

我有下面的方法將數據保存到用戶表以及user_details表。Rails如何獲得關聯的模型屬性

當我將@ newUser變量傳遞給EmailMailer時,我無法訪問user_details屬性。我如何傳遞@ newUser對象中的user_details而不必重新查詢數據庫?

模型

class User < ActiveRecord::Base 
    has_one :user_details, :dependent => :destroy 
    accepts_nested_attributes_for :user_details 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :login, :home_phone, :cell_phone, :work_phone, :birthday, :home_address, :work_address, :position, :company, :user_details_attributes 
end 

class UserDetails < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :first_name, :last_name, :home_phone, :cell_phone, :work_phone, :birthday, :home_address, :work_address, :position, :company 
end 

控制器

# POST /users 
def create 
     @newUser = User.new(params[:user], :include =>:user_details) 

     # create password 
     require 'securerandom' 
    password = SecureRandom.urlsafe_base64(8) 

     @newUser.password = password 

     respond_to do |format| 
      if @newUser.save 

       @newUser.build_user_details 
       # Tell the UserMailer to send a welcome Email after save 
       EmailMailer.welcome_email(@newUser).deliver 
       # To be used in dev only. Just tests if the email was queued for sending. 
       #assert ActionMailer::Base.deliveries.empty? 
       format.html { 
        flash[:success] = "User created successfully" 
        redirect_to(contacts_path) 
       } 
      else 
       format.html { 
        flash[:error] = flash[:error].to_a.concat resource.errors.full_messages 
        redirect_to(contacts_path) 
       } 
      end 
     end 
    end 
+0

@newuser是一個實例變量,您可以像處理視圖一樣使用實例變量來處理郵件,就像在視圖中一樣。 – Ryan

+0

我知道瑞安,但我不知道如何獲得@ newUser實例變量可訪問的user_details。 – Catfish

+0

@Catfish僅供參考,你不應該像這樣發送內聯郵件。他們應該被轉移到後臺處理。您可以使用DelayedJob或Resque輕鬆完成此操作。這樣的內聯電子郵件傳遞將對您的表現產生嚴重影響。 –

回答

1

像這樣的東西可能會做你以後的事情。

class User < ActiveRecord::Base 
    has_one :user_details 
    accepts_nested_attributes_for :user_details 
    after_initialize :build_user_details 
    ... 
end 

# In controller 
def create 
    @new_user = User.new 
    @new_user.attributes = params[:user] 
    if @new_user.save 
    # do mail thing 
    else 
    # other thing 
    end 
end 
+0

如果我嘗試這種方式,我得到錯誤'undefined method after_initialization' – Catfish

+0

對不起。它是'after_initialze'而不是'after_initialization'。更新。 –

+0

這似乎解決了目前的問題,但現在我有另一個奇怪的問題。我會再問一個問題。 – Catfish

0

你需要建立的UserDetails協會節能@newUser

@newUser.build_user_details 
if @newUser.save 
    #send mailer 
else 
    #do something else 
end 

之前,或者,您也可以在@newuser後使用create動作已保存

if @newUser.save 
    @newUser.create_user_details 
    #send mailer 
else 
    #do something else 
end 

順便說一下,R​​uby/Rails約定是使用snake_case作爲變量。所以@ newUser應該是@new_user。

+0

我很確定,我試過你的第一個解決方案,它並沒有將我的user_details保存到數據庫中。我會嘗試你的第二個解決方案,因爲我不知道'create_user_details'。方法'create_user_details'和'build_user_details'來自哪裏? – Catfish

+0

這些方法是'method_missing'助手通過'has_one'關係給你的。第二種解決方案不會爲您節省查詢,因爲它會導致兩次寫入。第一個解決方案應該工作得很好。或者,您可以將一個生命週期方法附加到用戶,該用戶在'user'初始化後初始化'user_detail'對象。 –

+0

有了你的第一個解決方案,如果我在'@ newUser.save'後面加上'@ newUser.build_user_details',你可以看到user_details在這個鏈接中被刪除 - http://pastebin.com/fZ7zGimD。這是爲什麼?如果我完全刪除了build_user_details行,那麼user_details會被保存。 – Catfish

相關問題