سؤال

لقد قمت بتثبيت مصادقة مريحة ويبدو أن كل شيء يعمل بشكل جيد. يمكنني الاشتراك وتسجيل الدخول. الطريقة الوحيدة التي يمكنني تسجيل الخروج بها هي الكتابة في عنوان 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top