我想为评论模型进行自定义验证:未注册的用户在提交评论时不应使用注册用户的电子邮件。
我把自定义验证程序类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方法的错误。这是一条无处可去的道路。 那么如何制作这种自定义验证方式呢?
答案 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