ruby-on-rails مشكلة - إعادة توجيه إعادة التوجيه بعد فشل تسجيل الدخول





إخطار حل (5)


بالتفصيل في جواب ماركو ، أوصي بوضع بعض debugger في طريقة ردك على CustomFailure من أجل فهم أفضل لما يجري.

Class CustomFailure < Devise::FailureApp
  def respond
    binding.pry
    super
  end
end

إذا نظرت إلى شفرة المصدر FailureApp Devise للحصول على طريقة الإجابة فمن السهل جدًا فهم ما يجري.

def respond
  if http_auth?
    http_auth
  elsif warden_options[:recall]
    recall
  else
    redirect
  end
end

لذلك على سبيل المثال ، لإعادة redirect_url ، ستحتاج إلى التأكد من أن أوامر رمز respond ستعيد في النهاية عملية إعادة redirect .

ومع ذلك ، إذا كنت تريد إرجاع حالة 401 قياسية كما هو محدد في الطريقة http_auth ، فأنت تريد التحقق من أن شفرة أسلوب respond الخاصة بك تقوم بإرجاع http_auth .

وبالتالي ، يستحق الأمر النظر إلى تعريف http_auth? على وجه الخصوص ، لاحظ: request.xhr? الطريقة ، والتي ستعود 0 لطلبات json (أذكر أن 0 يقيم فعلا إلى صحيح في روبي)

def http_auth?
  if request.xhr?
    Devise.http_authenticatable_on_xhr
  else
    !(request_format && is_navigational_format?)
  end
end

وربما تحقق من برامجك المبدئية / devise file for config.http_authenticatable_on_xhr أو config.navigational_formats للتحكم في الاستجابة التي تريدها. يمكن أن تؤثر هذه التهيئة في الواقع على ما يقوم Devise بإرجاعه ويمكن أن يؤدي غالبًا إلى سلوك غير متوقع بسبب ما يفعله هنا تحت غطاء المحرك.

وترتبط جميع الأسئلة التي وجدتها لتسجيل الدخول ناجحة مع المساعد after_sign_in_path_for(resource)

لدي نموذج تسجيل دخول في فهرس الموقع ، وعندما يفشل تسجيل الدخول في إعادة التوجيه إلى "users / sign_in"

ولكن كيف يمكنني إعادة التوجيه إلى "site # index" عندما يفشل تسجيل الدخول؟







هذا ما يحدث مع وضع 3.1.0

Started POST "/users/sign_in"
Processing by Devise::SessionsController#create
Completed 401 Unauthorized
Processing by Devise::SessionsController#new

يتم استدعاء جديد بسبب auth_options المحددة في نهاية الجواهر / devise-3.1.0 / app / controllers / devise / sessions_controller.rb

يجب إعادة تعريف auth_options المستخدمة في إجراء الإنشاء. لقد قمت بنسخ وحدة التحكم في التطبيق / وحدات التحكم / devise / sessions_controller.rb من تطبيق Rails واستبدلت طريقة auth_options مثل هذه

def auth_options
  { :scope => resource_name, :recall => "Home#new" }
end

يفعل الخدعة ، ولكن لا يزال url / users / sign_in

سأحاول إصلاح ذلك أيضا.




  1. قم بإنشاء custom_failure.rb في دليل lib الخاص بك ، مع:

    class CustomFailure < Devise::FailureApp
      def redirect_url
        your_path
      end
    
      def respond
        if http_auth?
          http_auth
        else
          redirect
        end
      end
    end
    
  2. في لك تهيئة مبدئي ، وتشمل:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
  3. تأكد من أن Rails هو تحميل ملفات lib في التطبيق الخاص بك:

    config.autoload_paths += %W(#{config.root}/lib)
    

لا تنس إعادة تشغيل الخادم الخاص بك.

لا أعتقد أن هناك طريقة أسهل للقيام بذلك. حظا طيبا وفقك الله.




لقد نسخت التعليمة exception_notification ولصقها من التطبيق القديم إلى التطبيق الجديد وفشلت. جلبت لي هنا ولم تكن أي من الإجابات المذكورة أعلاه محدثة. منذ إصدار 4.x تمت إعادة تسمية الوسيطة إلى ExceptionNotification::Rack ، لذا يبدو التكوين الوسيلي مثل ذلك:

Whatever::Application.config.middleware.use ExceptionNotification::Rack,
 :email => {
   :email_prefix => "[Whatever] ",
   :sender_address => %{"notifier" <[email protected]>},
   :exception_recipients => %w{[email protected]}
 }




ruby-on-rails redirect login devise