1

私はRailsを使った一種のプロジェクト管理アプリに取り組んでいます(私のRailsスキルはちょっと錆びています)。私には2つのモデルオブジェクトがあります。この場合はUserとAccountで、多対多の関係があります(CompanyはAccountのより良い名前かもしれません)。ユーザーがサインアップすると、ネストされたフォームのヘルプを使用して(.buildを使用して)新しいアカウントが作成されます。アカウントモデルには、nameとaccount_adminの2つのフィールドがあります。最初のユーザーがアカウントを作成するときに、account_adminをユーザーIDに設定します。しかし、これを機能させることはできません。

モデルは次のように設定されています。

class Account < ActiveRecord::Base
  attr_accessible :name, :account_admin

  validates_presence_of :name 

  has_many :projects, dependent: :destroy
  has_many :collaborators
  has_many :users, through: :collaborators
end 

class User < ActiveRecord::Base
  has_secure_password
  attr_accessible :email, :name, :password, :password_confirmation, :accounts_attributes

  has_many :collaborators
  has_many :accounts, through: :collaborators
  accepts_nested_attributes_for :accounts
  [...]

UserControllerは次のようになります。

def new
  if signed_in?
    redirect_to root_path
  else
    @user = User.new
    # Here I'm currently trying to set the account_admin value, but it seems to be nil. 
    account = @user.accounts.build(:account_admin => @user.id)
  end
end  

作成アクションにも移動しようとしましaccount = @user.accounts.build(:account_admin => @user.id)たが、フィールドがフォームから消えます。

私が望むことを達成するための適切な方法は何ですか(作成時にaccount_adminをユーザーIDに設定します)?または、どのユーザーがアカウントを作成したかを見つけるためのより良いアプローチがありますか(つまり、リレーションシップテーブルで何かをします)?

アップデート

@joelparkerhendersonの助けを借りて、私はそれを機能させたと思います。ユーザーモデルで次のようなメソッドを作成しました。

def set_account_admin
  account = self.accounts.last
  if account.account_admin == nil
    account.account_admin = self.id
    account.save
  end
end

私はこれを呼び出しますafter_create :set_account_admin。これは機能しますが、同じことを行うためのより多くの「レールの方法」はありますか?

ありがとう。

4

1 に答える 1

1

を呼び出すとき#new、ユーザーはまだIDを持っていません(nilです)。

#saveユーザーになると、Railsは自動的にユーザーに新しいIDを与えます。

after_createその後、 Active Recordコールバックを使用して、新しいアカウントを設定できます。account_admin

于 2012-04-07T11:57:18.793 に答える