2015-07-12 50 views
-1

我創建了一個項目,允許用戶通過添加電子郵件來邀請其他用戶。當他們添加他們的電子郵件時創建一個用戶。不過,我在跳過驗證時遇到了一些問題。密碼的有效記錄條件驗證

關於邀請,我想跳過密碼驗證。因爲只有電子郵件是必需的。我正在使用BCrypt和has_secure_password。有人想知道如何跳過這個嗎?

我invitations_controller:

def create 
    @user = User.new(invite_params) 
    if @user.save 
    @user.create_invitation_digest 
    @user.send_invitation_email 
    flash[:success] = 'User invited' 
    redirect_to new_invitation_path 
    else 
    flash.now[:danger] = 'Unable to invite' 
    render 'new' 
    end 
end 

和我的用戶模型:

validates :name, presence: true, length: { maximum: 50 }, unless: :invited? 
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
has_secure_password 
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 
belongs_to :company 

def invited? 
controller_name = 'invitations' 
end 
+0

嘗試'驗證:密碼,存在:真,長度:{最小:6},allow_nil:真,除非::邀請' – Pavan

+0

確實不起作用,因爲has_secure_password在創建時對驗證密碼進行了預定義的驗證。 –

+0

嗯嘗試這個'has_secure_password:驗證=> false'以及上述。 – Pavan

回答

1

一種方法是去除has_secure_password從模型和下面一樣改變密碼驗證。

validates :password, presence: true, length: { minimum: 6 }, allow_nil: true, unless: :invited? 

如果您想對密碼的確認支票是由has_secure_password提供,然後手動提供密碼確認驗證像下面。

validates_confirmation_of :password 

,你可以寫你自己的定製的認證像下面,如果你想通過has_secure_password提供密碼認證。

def password=(password_str) 
    @password = password_str 
    self.password_salt = BCrypt::Engine.generate_salt 
    self.password_digest = BCrypt::Engine.hash_secret(password_str, password_salt) 
end 

def authenticate(password) 
    password.present? && password_digest.present? && password_digest == BCrypt::Engine.hash_secret(password, password_salt) 
end 
0

你也可以這樣做:

聲明中模型的屬性和控制器將其值設置爲true。並且只有在模型的值爲false時纔在模型中執行has_secured_pa​​ssword。

user.rb

attr_accessor: skip_validation // Add this line 
has_secured_password, :unless => :skip_validation // Add IF condition here 

user_controller.rb

def create 
@user = User.new(invite_params) 
@user.skip_validation = true // Add this line 
    if @user.save 
    @user.create_invitation_digest 
    @user.send_invitation_email 
    flash[:success] = 'User invited' 
    redirect_to new_invitation_path 
    else 
    flash.now[:danger] = 'Unable to invite' 
    render 'new' 
    end 
end 
+0

,導致未定義的局部變量或方法'skip_validation' –

+0

檢查我更新的代碼。 –