0

さて、私は対処方法がわからない非常に奇妙なシナリオを持っているので、私があなたにそれを説明しようとしているので、私に耐えてください。

私は次のモデルを持っています。

class User < ActiveRecord::Base
  Roles = { pending: 'pending_user', role2: 'role2', etc: 'etc' }
  attr_accessible :role
  validates :role, inclusion: {in: Roles.values}
  before_create :add_pendng_role #Set user role to Roles[:pending]
end

問題は、初めてレコードを作成するときに、この検証が失敗することです。たとえば、私のコントローラーには次のコードがあります。

class UsersController < ActionController::Base
  @user = User.new params[:user]
  if @user.save  # ---------------   ALWAYS FAILS -------------------------------
    #do something
  else
    #do something else
  end
end

失敗したと思う理由はbefore_create、検証に合格した後に呼び出されるロールのみが追加されるためです。検証が行われるたびに役割が追加されると思うので、置き換えることができないことがわかりました。それができない理由は、アプリケーションでユーザーの役割が変更され、ユーザーに対して検証が行われるたびに役割をリセットしたくないためです。before_create :add_role before_validation :add_role

私がこれにどのように取り組むことができるかについての手がかりはありますか?

4

3 に答える 3

2

Railsコールバックガイドで説明されているように、*before_validation*を使用します

class User < ActiveRecord::Base
  Roles = { pending: 'pending_user', role2: 'role2', etc: 'etc' }
  attr_accessible :role
  validates :role, inclusion: {in: Roles.values}
  before_validation :add_pendng_role, on: :create #Set user role to Roles[:pending]
end
于 2013-03-03T22:34:30.667 に答える
2

あなたは試すことができます:

before_validation :add_role, on: :create
于 2013-03-03T22:34:31.687 に答える
1

引数を使用すると、に変更できるようですbefore_createbefore_validation:on

before_validation :add_pendng_role, :on => :create
于 2013-03-03T22:38:08.830 に答える