使用助手方法进行自定义验证

时间:2013-06-24 19:44:01

标签: ruby-on-rails validation

我想为评论模型进行自定义验证:未注册的用户在提交评论时不应使用注册用户的电子邮件。

我把自定义验证程序类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无法看到此方法。我可以在Validator类中包含sessions_helper,但它给出了一个关于cookie方法的错误。这是一条无处可去的道路。 那么如何制作这种自定义验证方式呢?

1 个答案:

答案 0 :(得分: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