1

users テーブルと user_details テーブルにデータを保存する以下のメソッドがあります。

@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
4

2 に答える 2

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
于 2012-11-21T01:34:26.320 に答える
0

@newUser を保存する前に UserDetails 関連付けを作成する必要があります

@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

ちなみに、Ruby/Rails の規約では、変数には snake_case を使用します。したがって、@newUser は @new_user である必要があります。

于 2012-11-21T00:43:48.337 に答える