2013-03-03 61 views
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_rolebefore_validation :add_role因爲我認爲它會在每次驗證完成後添加角色。我不能這樣做的原因是因爲用戶角色將在應用程序中發生變化,並且我不想在每次對用戶進行驗證時重置角色。

任何線索我如何解決這個問題?

回答

2

解釋你可以嘗試:

before_validation :add_role, on: :create 
+0

+1 - http://api.rubyonr ails.org/classes/ActiveRecord/Callbacks.html按順序列出回調事件,遞交參考 – house9 2013-03-03 22:38:55

+0

對不起,我錯過了參考文獻!謝謝你所有的答案 – user1000232 2013-03-03 22:40:57

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

看起來你可以改變before_createbefore_validation如果使用:on參數:

before_validation :add_pendng_role, :on => :create