0

コメント モデルのカスタム検証を行いたい: 未登録ユーザーは、コメントを送信するときに、登録ユーザーの電子メールを使用しないでください。

カスタムバリデータークラスを配置します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 クラスに sessions_helper を含めることはできますが、Cookie メソッドに関するエラーが発生します。それはどこにも行かない道です。では、このカスタム検証レールを作成するにはどうすればよいでしょうか?

4

1 に答える 1

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
于 2013-06-24T19:57:20.390 に答える