0

アプリケーションで電子メール検証プロセスを設定しようとしていますが、トークンを正常に生成し、ユーザーがサインアップしたときに電子メールを送信します。しかし、検証リンクをクリックすると、「users_controller/confirm」アクションのifステートメントとelseステートメントの両方が実行されます。root_pathにリダイレクトされますが、ユーザーレコードの2つのフィールドが変更されています。Railsコンソールからfind_by_tokenを実行すると、期待されるユーザーが返されます。私はmysqlを使用していますが、クエリに何らかの遅延があり、両方が実行されるのではないかと考えています。

  def confirm
    if User.find_by_token(params[:token]).nil?
      redirect_to root_path
    else
      @user = User.find_by_token(params[:token])
      cookies[:auth_token] = @user.auth_token
      User.skip_callbacks = true
      @user.update_attribute(:token, "")
      @user.update_attribute(:confirmed, 1)
      User.skip_callbacks = false
      reset_session
      redirect_to routes_path
    end
  end
4

1 に答える 1

2

フィルタの前に使用して、このようにチェックしてリダイレクトできます

  before_filter :find_user

  def confirm
    #your action code
  end

  private
  def find_user
    @email = User.find_by_token params[:token].to_s
    redirect_to root_path, notice: 'Your token is wrong!' if @email.nil?
  end

このように、アクションのコードは有効なレコードに対してのみ実行されます。

于 2012-04-05T06:38:14.937 に答える