2013-06-24 63 views
0

我想爲Comment模型進行自定義驗證:未註冊的用戶在提交註釋時不應使用註冊用戶的電子郵件。使用助手方法進行自定義驗證

我把自定義的驗證類app/validators/validate_comment_email.rb

class ValidateCommentEmail < ActiveModel::Validator 

    def validate(record) 
    user_emails = User.pluck(:email) 
    if current_user.nil? && user_emails.include?(record.comment_author_email) 
     record.errors[:comment_author_email] << 'This e-mail is used by existing user.' 
    end 
    end 

end 

在我的模型文件app/models/comment.rb

class Comment < ActiveRecord::Base 
    include ActiveModel::Validations 
    validates_with ValidateCommentEmail 
    ... 
end 

的問題是,我使用current_user方法從我sessions_helper.rb

def current_user 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
end 

Validator無法看到th是方法。我可以在Validator類中包含sessions_helper,但它給了我一個關於cookie方法的錯誤。這是一條無路可走的道路。 那麼如何使這個自定義驗證軌道的方式?

+0

可以將評論直接與用戶相關聯(除了author_email)嗎? – PinnyM

+0

我想通過調用'current_user.nil?'來確保註釋的用戶沒有註冊。難以檢查評論記錄是否有關聯用戶?這樣你就不需要'current_user'。 – mario

+0

如果現有用戶提交的評論,它直接與用戶關聯。但我想檢查一下未註冊用戶是否使用註冊用戶的電子郵件。所以我需要檢查這個用戶:1.沒有登錄; 2.他的電子郵件不在註冊電子郵件列表中。 –

回答

0

如果如果它是由一個註冊用戶(belongs_to :user)創建的評論都知道,你可以簡單地檢查針對:

def validate(record) 
    if record.user_id.nil? && User.where(:email => record.comment_author_email).exists? 
    record.errors[:comment_author_email] << 'This e-mail is used by existing user.' 
    end 
end 

如果沒有,我覺得這驗證不應該使用標準驗證程序來執行。它不會意識到有足夠的上下文來確定模型是否符合這個標準。相反,你應該通過從控制器本身傳遞current_user來手動檢查:

# in comments_controller.rb 
def create 
    @comment = Comment.new(params[:comment]) 
    if @comment.validate_email(current_user) && @comment.save 
    ... 
end 

# in comment.rb 
def validate_email(current_user) 
    if current_user.nil? && User.where(:email => record.comment_author_email).exists? 
    errors[:comment_author_email] << 'This e-mail is used by existing user.' 
    end 
end 
+0

太棒了!謝謝!) –

+0

@AlexFedoseev:請注意,您可以使用'exists?'更高效地檢查匹配的電子郵件 - 請參閱更新。 – PinnyM

相關問題