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在验证通过后调用的角色。现在我知道我不能用 with 替换before_create :add_role 因为before_validation :add_role我认为每次验证完成时它都会添加角色。我不能这样做的原因是用户角色将在应用程序中更改,并且我不想在每次对用户进行验证时重置角色。

关于我如何解决这个问题的任何线索?

4

3 回答 3

2

使用 *before_validation*,如rails 回调指南中所述

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_create为:before_validation:on

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