2012-11-21 36 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

相关问题