إضافة زر تسجيل الخروج في مصادقة مريحة
-
24-09-2019 - |
سؤال
لقد قمت بتثبيت مصادقة مريحة ويبدو أن كل شيء يعمل بشكل جيد. يمكنني الاشتراك وتسجيل الدخول. الطريقة الوحيدة التي يمكنني تسجيل الخروج بها هي الكتابة في عنوان URL http: // localhost: 3000/logout
كيف يمكنني إضافة زر تسجيل الدخول على صفحة؟ حاولت إضافة واحد إلى الأعضاء. rhtml
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
الذي يشير إلى session_controller.rb لكنني أحصل على خطأ "لا يوجد إجراء يستجيب للعرض. الإجراءات: إنشاء ، تدمير ، وجديد"
أي أفكار؟ شكرا
المحلول
ماذا لديك في ملف طرقك؟
حاول وضع
map.log_out 'logout', :controller => 'sessions', :action => 'destroy'
في طرقك.
ثم فقط لديك
<%= link_to "Sign out", log_out_url %>
للحصول على رابط تسجيل الخروج.
تعديل
كل شيء وصولاً إلى كيفية تحديد التوجيه.
لأنه كان لديك map.log_out في التوجيه ، ثم عنوان URL http: // localhost: 3000/logout يتم التقاط عنوان URL من قبل هذا وتوجيه إلى الإجراء الصحيح.
اذا كنت تمتلك :
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
هذا سيولد رابط لك فقط http: // localhost: 3000/جلسة. لكنه لا يفعل شيئًا للتوجيه. لا تزال بحاجة إلى تحديد الطرق الصحيحة.
لاحظ أن Rails لا تقوم بإلحاق إجراء تدمير عنوان URL. (لن يخلق http: // localhost: 3000/جلسة/تدمير.) يفترض أنه إذا كان لديك إجراء من التدمير ، فسترسله باستخدام فعل HTTP الحذف. لسبب ما ، إنه ليس مثاليًا تمامًا ولا يتم بالفعل إرسال الفعل الحذف.
يمكنك إجباره على القيام بذلك:
<%= link_to "logout", {:controller=> "user_sessions", :action=> "destroy"}, :method => :delete%>
سيظل هذا لا يعمل إلا إذا قمت أيضًا بتوجيهه بشكل صحيح. إذا وضعت ما يلي في الطرق:
map.resource :session
ثم ستقوم القضبان بإنشاء التوجيه لجميع الأفعال وتحديد الإجراءات الافتراضية لهم ، بما في ذلك الحذف. ويمكن الاطلاع على مزيد من المعلومات هنا : توجيه القضبان من الخارج في.
تستحق هذه الصفحة بأكملها القراءة مرارًا وتكرارًا حتى تفهمها حقًا. التوجيه هو مفتاح فهم القضبان!
للحصول على وحدة تحكم بسيطة مثل الجلسات ، من الأسهل فقط تحديد مسار log_out ثم ارتباط بـ log_out_url ..
(نأمل أن يكون من المنطقي ، الحرمان من النوم زاحف!)
نصائح أخرى
إذا كنت تستخدم ابتكار ونموذجك المعني هو مستخدم, ، الطريقة الأنيقة هنا:
<%= link_to 'logout', destroy_user_session_path, method: :delete %>
يعمل لأن:
- نظرًا لطرق HTTP ، يتم الحصول على أو نشرها وتصحيحها وحذفها ، لذا باستخدام
method: :delete
(ليسmethod: :destroy
) - كانوا يستخدمون
destroy_user_session_path
مع ابتكار و مستخدم النموذج كالمعتاد ، إذا حددت اسم طراز آخر مثل مدير يمكنك فقط تغيير مسار تسجيل الدخول إلىdestroy_manager_session_path