验证包含不在创建上

时间:2013-03-03 22:30:34

标签: ruby-on-rails validation

好吧,我有一个很奇怪的场景,我不知道如何处理,所以请在我尝试向你解释时请耐心等待。

我有以下型号。

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

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

3 个答案:

答案 0 :(得分:2)

使用* before_validation *,如rails callback guide

中所述
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

答案 1 :(得分:2)

你可以尝试:

before_validation :add_role, on: :create

答案 2 :(得分:1)

如果您使用before_create参数,您似乎可以将before_validation更改为:on

before_validation :add_pendng_role, :on => :create