ไม่มีเส้นทางที่ตรงกับ“ / users / sign_out” ประดิษฐ์ราง 3


386

ฉันได้ติดตั้ง devise ในแอพของฉันและใช้สิ่งต่อไปนี้ในapplication.html.erbไฟล์ของฉัน:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

ฉันวิ่งrake routesและยืนยันว่าเส้นทางทั้งหมดถูกต้อง

นอกจากนี้ในของฉัน routes.rbไฟล์ฉันมีและdevise_for :usersroot :to => "home#index"

ฉันได้รับข้อผิดพลาดการกำหนดเส้นทางต่อไปนี้เมื่อคลิกลิงก์ "ออกจากระบบ":

No route matches "/users/sign_out"

ความคิดใดที่ทำให้เกิดข้อผิดพลาด?


1
คุณรีสตาร์ทแอพหลังจากเพิ่มเส้นทางแล้วหรือยัง? การเปลี่ยนเส้นทางจะมีผลเมื่อเริ่มต้นเท่านั้น
Thilo-Alexander Ginkel

2
ใช่. เพิ่งทำอีกครั้งเพื่อความปลอดภัย นอกจากนี้ผมอ่านที่อื่นในกองว่ามันอาจจะมีปัญหากับอัญมณีประดิษฐ์ใหม่ล่าสุดที่จะไม่เข้ากันได้กับ Rails 3.0.3 ดังนั้นฉันพยายามเปลี่ยนอัญมณีประดิษฐ์ของฉันจาก 1.4.2 gem 'devise', :git => 'git://github.com/plataformatec/devise.git'ไป แต่นั่นก็ไม่ได้ทำอะไร
vich

จะไม่เปลี่ยนรายการใน Gemfile เพียงแค่ให้คุณได้รับ Devise เวอร์ชันใหม่กว่าเดิมหรือไม่ คุณลองระบุหมายเลขรุ่นที่ต่ำกว่านี้หรือไม่?
Leo Cassarani

คุณสามารถโพสต์ไฟล์ route.rb ของคุณได้ไหม
felix

1
คำตอบที่สองโดย Jessie ด้านล่างทำงานได้อย่างสมบูรณ์
วิช

คำตอบ:


568

ฉันคิดว่าเส้นทางสำหรับการลงชื่อออกเป็นDELETEวิธีหนึ่ง หมายความว่าลิงก์ออกจากระบบของคุณต้องมีลักษณะดังนี้:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

ของคุณไม่ได้รวม:method => :deleteส่วน นอกจากนี้โปรดทราบว่าในการทำงานคุณต้องรวม<%= javascript_include_tag :defaults %>ไว้ในไฟล์เลย์เอาต์ของคุณ ( application.html.erb)


3
ฉันสามารถพูดได้อย่างปลอดภัยว่าไม่เคยทำเช่นนั้นในแอพ Rails ใด ๆ ของฉัน link_to "Sign out", destroy_user_session_pathดีพอสำหรับฉันเสมอ
Leo Cassarani

8
ฉันทำการทดสอบและมันได้ผลสำหรับฉัน อย่าลืมว่าสิ่งต่าง ๆ เปลี่ยนจากรุ่นหนึ่งเป็นรุ่นอื่น (ไม่ว่าจะเป็น Rails หรือ Devise) นอกจากนี้การออกจากระบบเป็นพฤติกรรมการเปลี่ยนสถานะซึ่งไม่ควรทำโดยใช้วิธีการ GET (ตามความเห็นของฉัน)
Jessie Dedecker

23
สำหรับข้อมูลเพิ่มเติมให้เหตุผลว่าทำไมถึงได้มีการเปลี่ยนแปลงในรุ่นล่าสุดของประดิษฐ์อธิบายไว้ที่นี่และที่นี่
Jessie Dedecker

6
ฉันพบปัญหาเดียวกันนี้และข้อเสนอแนะของเจสซีก็ใช้ได้สำหรับฉัน ผมคาดว่าทุกคนที่กำลังวิ่งผ่าน railscast ประดิษฐ์ไปในที่สุดจบลงที่นี่จากการเปลี่ยนแปลงนี้ ...
johnnygoodman

2
คุณสามารถพิมพ์สิ่งนี้ลงในเว็บคอนโซลของคุณเพื่อทดสอบ$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');- ถ้าโหลด jQuery บนหน้า
mraaroncruz

133

ฉันเปลี่ยนบรรทัดนี้เป็น devise.rb:

config.sign_out_via = :delete

ถึง

config.sign_out_via = :get

และมันก็เริ่มทำงานให้ฉัน


22
วิธีที่เคยทำมาก่อนคือออกจากระบบโดยใช้ "GET / users / sign_out" แต่พวกเขาเปลี่ยนเป็น "DELETE" เพื่อทำให้ RESTful มากขึ้น ผู้เขียนอธิบายว่า GET ไม่ควรทำการเปลี่ยนแปลงกับเซิร์ฟเวอร์เช่นออกจากระบบ
Jonathan Allard

2
สิ่งนี้ใช้ได้สำหรับฉัน ในขณะที่ฉันชื่นชมมันไม่ใช่วิธีปฏิบัติที่ดีที่สุดคำตอบอื่น ๆ ล้มเหลว ฉันไม่เห็นว่าทำไม !!
Mild Fuzz

8
นอกจากนี้ยังเป็นไปได้ที่จะใช้อาร์เรย์หากคุณต้องการสนับสนุนหลายวิธี ตัวอย่างเช่น: config.sign_out_via = [ :post, :delete ]หรือdevise_for :users, :sign_out_via => [ :post, :delete ]ที่อธิบายไว้ในประดิษฐ์ / ราง / routes.rb
Hosam Aly

2
ฉันจะไม่ใช้คำขอ GET สำหรับการออกจากระบบเนื่องจากเปิดผู้ใช้ถึงการโจมตี XSRF (แฮ็กเกอร์สร้างเว็บไซต์ที่มีแท็กรูปภาพพร้อม src = " foo.com/users/sign_out " ผู้ใช้เยี่ยมชมและออกจากระบบ)
Ryan Doherty

1
@RyanDoherty Id ฉันไม่เข้าใจผิด XSRF ยังคงเป็นไปได้ (ผู้โจมตีเพียงแค่ใช้แบบฟอร์มที่มี action = "DELETE" บน URL เป้าหมายจากนั้นส่งอัตโนมัติที่โหลดหน้าเว็บ)
Maël Nison

60

คุณอาจไม่ได้รวมไฟล์ jquery_ujs javascript ตรวจสอบให้แน่ใจว่าคุณใช้ jquery-ujs เวอร์ชันล่าสุด: https://github.com/rails/jquery-ujsและไฟล์ล่าสุดที่มี:

rails generate jquery:install

คุณไม่ควรมีไฟล์ rails.js อีกต่อไป ถ้าเป็นเช่นนั้นคุณอาจล้าสมัย ตรวจสอบให้แน่ใจว่าไฟล์นี้ถูกโหลดด้วยค่าเริ่มต้นใน config / application.rb

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(อีกครั้งคุณไม่ควรมีไฟล์ rails.js ที่นี่) ในที่สุดเพิ่มลิงค์ตามเอกสารในDevise wiki (สไตล์ haml):

= link_to('Logout', destroy_user_session_path, :method => 'delete')

และทุกอย่างจะดี


8
ฉันมี: method => 'ลบ' ใน link_to ของฉันปัญหาไม่ได้รวมอยู่ใน jquery_ujs วิธีนี้แก้ไขปัญหาของฉันได้ อย่าลืมใส่อัญมณี 'jquery-rails' ไว้ใน gemfile ของคุณ
Rob Bazinet

2
ขอบคุณสิ่งนี้ใช้ได้สำหรับฉัน แทนที่จะใช้ค่าเริ่มต้นคุณสามารถใช้javascript_include_tag "jquery_ujs"
Bnicholas

เยี่ยมมากขอบคุณ! ฉันใช้ require.js เพื่อโหลดไฟล์แบบอะซิงโครนัสและลืมที่จะต้องการ jquery_ujs
Dan Fairaizl

ผมถือว่า "u" application.jsหมายถึงไม่มีการบีบอัดและลบออกจากบรรทัดนี้ สมมติฐานที่ไม่ดีฉันคิดว่า ขอบคุณ
Jeff

ปัญหานี้ถูกครอบตัด (ในแอปที่ใช้งานครั้งที่ 100 ของฉัน) หลังจากเปลี่ยน bootstrap twitter จากน้อยไปเป็น sass และฉันลืมเพิ่ม // // ต้องการ jquery_ujs ลงใน application.js ของฉัน
Joe

31

ความสามารถในการสร้างลิงก์ออกจากระบบการเรียกใช้ DELETE RESTful ต้องใช้แอตทริบิวต์ html data-method = "delete"โดยใช้รหัสราง= link_to('Logout', destroy_user_session_path, :method => :delete)โดยใช้รหัสราง

อย่างไรก็ตามหากคุณไม่ได้jquery-ujsติดตั้งgem หรือไม่ได้เรียกจาวาสคริปต์ที่เป็นผลลัพธ์ใน application.html ของคุณผ่านทาง= javascript_include_tag "application"การตอบกลับจะถูกส่งเป็นการร้องขอ GET และเส้นทางจะล้มเหลว

คุณมีตัวเลือกน้อยถ้าคุณไม่ต้องการใช้jquery-ujsหรือไม่สามารถหาวิธีที่จะทำให้มันใช้งานได้:

  1. เปลี่ยนconfig.sign_out_viaให้เท่ากัน:getภายในdevise.rb(ไม่แนะนำเนื่องจาก DELETE เป็นคำสั่ง RESTful ที่เหมาะสม)
  2. หรือเปลี่ยนแปลงไปlink_to = button_to('Logout', destroy_user_session_path, :method => :delete)ด้วยbutton_toRails จะทำการยกของหนักเพื่อทำการโทรออกอย่างถูกต้อง จากนั้นคุณสามารถจัดสไตล์ปุ่มเพื่อให้ดูเหมือนลิงค์หากคุณต้องการ

การเปลี่ยนจาก link_to เป็น button_to ใช้งานได้สำหรับฉัน แต่ฉันไม่เข้าใจว่าทำไม มีอะไรเปลี่ยนแปลงอย่างแน่นอนนอกเหนือจาก html / css
Spyros Mandekis

1
มันเกี่ยวข้องกับ 'เวทย์มนตร์ของทางรถไฟที่สร้างอัตโนมัติ html จากฟังก์ชั่นเช่น button_to และ link_to มันเกิดขึ้นเพียงเพราะเวทมนตร์ของ button_to ระบุ RESTful DELETE call ที่เหมาะสมและ link_to ไม่ได้ ถ้าฉันต้องเดาฉันจะบอกเหตุผลว่าองค์ประกอบปุ่ม html สามารถจัดการการโทรลบ (หรือรวมกับฟิลด์ที่ซ่อนไว้ซึ่งระบุการกระทำ) ในขณะที่ลิงก์ปกติไม่สามารถทำได้
นาธานจะ

ขอบคุณสำหรับสิ่งนี้. ฉันตั้งค่าแอพของฉันให้จัดการ jquery ด้วยตนเองดังนั้นฉันจึงไม่มี jquery-ujs การติดตั้งด้วย bower หรือ bundler และรวมถึงบรรทัดที่เหมาะสมสำหรับไปป์ไลน์สินทรัพย์แก้ไขปัญหา
jrhorn424

1
นี่เป็นโซลูชันที่ปลอดภัยและพกพาได้มากที่สุดสำหรับฉัน

เกี่ยวกับbutton_toRails สร้างformการกระทำทั้งหมด นั่นเป็นเหตุผลที่เป็นไปได้ที่จะใช้:deleteวิธีการด้วยbutton_toและไม่ใช้link_toเพียงแค่ดู HTML ที่สร้างขึ้น
Fernando Fabreti

25

ลองเพิ่มเส้นทางใหม่เพื่อประดิษฐ์ / เซสชัน # ทำลายและเชื่อมโยงกับเส้นทางนั้น เช่น:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

ดู:

<%= link_to "Logout", logout_path %>

รับข้อผิดพลาดเดียวกันกับ mmichael การทดสอบด้านบนนี้ใช้งานได้สำหรับฉัน
rtfminc

1
ฉันยังมีข้อผิดพลาดเช่นเดียวกับ mmichael วิธีการแก้ปัญหาข้างต้นจะใช้งานได้ แต่ไม่ใช่วิธีที่ควรแก้ไข เส้นทางเริ่มต้นใน Devise ได้รวมเส้นทางการออกจากระบบไว้เป็นวิธีการลบแล้ว ปกติแล้วคุณไม่จำเป็นต้องเปลี่ยนเส้นทางเริ่มต้นด้วยตนเอง นั่นเป็นสาเหตุที่คุณสามารถแก้ไขได้โดยเพียงเพิ่มพารามิเตอร์แยกเข้ากับการlink_toโทรดังที่อธิบายไว้ในคำตอบอื่น ๆ
Jessie Dedecker

คุณไม่ต้องเพิ่มเส้นทางไปยัง route.rb fiile, devise ช่วยให้คุณเปลี่ยนวิธีใน devise.rb ซึ่งอยู่ในไดเรกทอรี / confit / initializers /
Travis Pessetto

6
ไม่เคยมีเส้นทางออกจากระบบเป็น GET
Jagira

@Jagira ทำไม ทำไมไม่ลบทั้งสองและรับ?
hrdwdmrbl


13

ฉันมีปัญหาเดียวกันกับราง 3.1.0 และฉันแก้ไขการเพิ่มไฟล์ในบรรทัดต่อไปนี้:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs

หากใช้ bower ลอง // = ต้องการ jquery-ujs
monteirobrena

10

ด้วยข้อยกเว้นหนึ่งข้อคำตอบของ Jessie นั้นใช้ได้กับฉัน:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

เปลี่ยน:

:delete

... ถึง:

'delete'

ดังนั้นรหัสที่ใช้งานได้สำหรับฉันคือ:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>

ขอขอบคุณสำหรับการโพสต์ข้อมูลโค้ดนี้ sign_out ใช้งานได้แล้ว
buk

9

หลายคำตอบของคำถามนี้อยู่แล้ว สำหรับฉันปัญหาคือสองเท่า:

  1. เมื่อฉันขยายเส้นทางของฉัน:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
  2. ฉันได้รับคำเตือนว่านี่เป็นค่าเสื่อมราคาดังนั้นฉันจึงแทนที่ด้วย:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
  3. ฉันคิดว่าฉันจะลบ jQuery ของฉัน ทางเลือกที่ไม่ดี อุปกรณ์กำลังใช้ jQuery เพื่อร้องขอ DELETE "ปลอม" และส่งเป็น GET ดังนั้นคุณต้อง:

    //= require jquery
    //= require jquery_ujs
  4. และแน่นอนลิงค์เดียวกันเป็นจำนวนมากที่กล่าวถึงก่อน:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

คุณสามารถอธิบายจุดที่ 3 .. ฉันเป็นเหยื่อของมันและฉันต้องการที่จะเข้าใจมันมากขึ้น
ราหุลเดส

1
อย่างแน่นอน เว็บไซต์ของคุณไม่ได้ส่งคำขอ DELETE ใด ๆ ค่อนข้างตรงไปตรงมามันจะใช้ GET และ POST เท่านั้น เพราะในชุมชน Rails มีการตกลงกันว่า (ด้วยเหตุผลที่ดี) เราต้องการลบบันทึกเมื่อส่งคำขอ DELETE เราจำเป็นต้องใช้เคล็ดลับเล็กน้อย เมื่ออยู่ใน ERB ของคุณคุณระบุวิธีการ:: ลบรางจะแปลงนั้นเป็นแท็ก HTML5: data-method = "ลบ" และส่งเป็น GET ตอนนี้นี่คือที่ jQuery-ujs และ jQuery เตะเข้าพวกเขาอนุญาตให้แอปรับรู้ว่านี่คือสิ่งที่คุณทำ เพื่อให้คำขอของคุณสามารถจับคู่กับการกระทำของตัวควบคุม
Lukasz Muzyka

หากปราศจากอัญมณีเหล่านี้จะไม่สามารถใช้งานได้ แน่นอนคุณสามารถเปลี่ยนการตั้งค่าของ devise (ใน devise initialiser) และขอให้ใช้ GET แทน DELETE
Lukasz Muzyka

7

เพิ่ม:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

ใช้แท็ก link_to เหล่านี้

 link_to 'Sign out', destroy_user_session_path, :method => :delete

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

ในเส้นทางเพิ่ม:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

7

ตัวเลือกอื่นคือการกำหนดค่าออกจากระบบให้เป็น GET แทน DELETE คุณสามารถเพิ่มบรรทัดต่อไปนี้ได้ /config/initializers/devise.rb

config.sign_out_via = :get

แต่อย่างที่ Steve Klabnik เขียนไว้ในบล็อกของเขา ) ลองใช้ DELETE เพราะความหมายของวิธีนี้


เฉพาะคำตอบนี้ใช้ได้กับฉันสำหรับ Devise 3.5.1 & Rails 4.2.3
sagar junnarkar

อย่าลืมรีสตาร์ทเซิร์ฟเวอร์ :)
jackmin

6

หากคุณใช้ Rails 3.1 ให้แน่ใจว่า application.html.erb ของคุณออกจากระบบดูเหมือนว่า:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

และจาวาสคริปต์ของคุณจะมีบรรทัดดังต่อไปนี้

<%= javascript_include_tag 'application' %>

ฉันเดาว่าอัญมณีบางอันเขียนทับโครงสร้างใหม่ของตำแหน่ง default.js


ขอบคุณ! นี่ทำให้ฉันบ้า!
Dorian

5

ลองดูด้วยซอร์สโค้ดใน GitHub:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (วันที่: 27 มิถุนายน 2554)

  • # วิธี HTTP เริ่มต้นที่ใช้ในการลงชื่อออกทรัพยากร ค่าเริ่มต้นคือ: รับ 188
  • # config.sign_out_via =: รับ 187
  • # วิธี HTTP เริ่มต้นที่ใช้ในการลงชื่อออกทรัพยากร ค่าเริ่มต้นคือ: ลบ 188
  • config.sign_out_via =: ลบ


5

ซึ่งหมายความว่าคุณยังไม่ได้สร้างไฟล์ jquery หลังจากติดตั้งอัญมณี jquery-rails ดังนั้นก่อนอื่นคุณต้องสร้างมันขึ้นมา

rails generate devise:install

ตัวเลือกแรก:

หมายความว่าคุณต้องเปลี่ยนบรรทัดต่อไปนี้ /config/initializers/devise.rb

config.sign_out_via =: ลบไปยัง config.sign_out_via =: get

ตัวเลือกที่สอง:

คุณเปลี่ยนบรรทัดนี้<%= link_to "Sign out", destroy_user_session_path %>ไป<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>ที่ไฟล์มุมมอง

มัก:method => :deleteจะไม่ได้เขียนโดยค่าเริ่มต้น


5

ฉันต้องการเพิ่มในสิ่งนี้แม้ว่ามันจะค่อนข้างเก่า

ลิงก์ "sign_out" ใช้งานไม่ได้แม้จะมี: method =>: delete

ความคิดเห็นที่ระบุว่า<%= javascript_include_tag :defaults %>จะต้องรวมเตือนฉันฉันเพิ่งเพิ่ม JQuery java script และใช้ง่าย<script src=""/>แท็กเพื่อรวมไว้

เมื่อฉันย้ายพวกเขาจากหลังจาก: เริ่มต้นไปก่อน sign_out เริ่มทำงานอีกครั้ง

หวังว่านี่จะช่วยใครซักคน


5

คำตอบส่วนใหญ่เป็นบางส่วน ฉันได้ตีปัญหานี้หลายครั้ง ต้องแก้ไขสองสิ่ง:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

จำเป็นต้องระบุวิธีการลบ

ประดิษฐ์แล้วใช้ jquery ดังนั้นคุณต้องโหลดมัน

   <%= javascript_include_tag "myDirectiveJSfile" %> 

และให้แน่ใจว่าทั้ง jquery และ jquery-ujs ถูกระบุใน myDirectiveJSfile.js ของคุณ

//= require jquery
//= require jquery_ujs

5

อย่าลืมที่จะรวมบรรทัดต่อไปนี้ไว้ใน application.js ของคุณ (Rails 3)

//= require_self
//= require jquery
//= require jquery_ujs

รวมjquery_ujsไว้ในแอปพลิเคชันทางรถไฟของฉันและใช้งานได้ทันที


4

หากคุณกำลังใช้HTTPS กับอุปกรณ์นั้นมันจะพังถ้าลิงก์ออกจากระบบของคุณเป็นรุ่นที่ไม่ปลอดภัย ที่ส่วนท้ายมันจะเปลี่ยนเส้นทางไปยังรุ่นที่ปลอดภัย การเปลี่ยนเส้นทางนั้นเป็น GET ซึ่งเป็นสาเหตุของปัญหา

ตรวจสอบให้แน่ใจว่าลิงก์ของคุณใช้ HTTPS คุณสามารถบังคับได้ด้วยprotocol: "https"ในตัวช่วย URL ของคุณ (ตรวจสอบให้แน่ใจว่าคุณใช้ตัวช่วย url ไม่ใช่ตัวช่วยพา ธ )

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>


3

ปัญหาเริ่มต้นด้วย rails 3.1 ... /app/assets/javascript/เพียงแค่มองหา application.js

หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ที่ชื่อนั้นฉันไม่รู้ว่าทำไมไฟล์ของฉันถึงหายไปหรือไม่เคยถูกสร้างขึ้น"rails new app"...มา

jquery...แฟ้มที่มีอินสแตนซ์สำหรับ


3

มีวิธีแก้ปัญหามากมาย แต่ส่วนใหญ่ใช้สิ่งนี้

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

หรือ config devise.rb ด้วยเมธอด sign_out ที่เหมาะสม

ในการประดิษฐ์

config.sign_out_via = :delete ( or  :get which u like to use.) 

3

ใช้:getและ:deleteวิธีการสำหรับเส้นทางของคุณ:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end

หมายเหตุ: จะต้องมี devise_for: ผู้ใช้ประกาศแยกต่างหากจากสิ่งนี้ ดูคำตอบจาก dipole_moment
เว็บไซต์

2

ในเส้นทางของคุณ rb:

 devise_for :users do
    get '/sign_out' => 'devise/sessions#destroy'
    get '/log_in' => 'devise/sessions#new'
    get '/log_out' => 'devise/sessions#destroy'
    get '/sign_up' => 'devise/registrations#new'
    get '/edit_profile' => 'devise/registrations#edit'
 end

และใน application.html.erb ของคุณ:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>

1
ไวยากรณ์อยู่ในขณะนี้: devise_for: ผู้ใช้ดังนั้นการได้รับจะต้องใส่ใน devise_scope: ผู้ใช้ทำหมายเหตุ: เอกพจน์: ผู้ใช้สำหรับ devise_scope
เว็บไซต์

2

นี่คือสิ่งที่ฉันทำ (ด้วย Rails 3.0 และ Devise 1.4.2):

  1. ทำให้หน้าเว็บของคุณโหลด rails.js
  2. ใช้พารามิเตอร์นี้: 'data-method' => 'ลบ'
  3. ความคิดที่ดีที่จะเพิ่มพารามิเตอร์นี้:: rel => 'nofollow'

1

ดูว่า route.rb ของคุณมี "ทรัพยากร: ผู้ใช้" หน้า "devise_for: users" หรือไม่จากนั้นลองเปลี่ยนพวกเขา:

  1. โรงงาน

    • devise_for: ผู้ใช้
    • ทรัพยากร: ผู้ใช้
  2. ล้มเหลว

    • ทรัพยากร: ผู้ใช้
    • devise_for: ผู้ใช้

1

the ':method => :delete'in page is' data-method="delete"'ดังนั้นหน้าของคุณต้องมี jquery_ujs.js มันจะส่งลิงค์พร้อมเมธอด delete ไม่ใช่ method get


1

ฉันรู้ว่านี่เป็นคำถามเก่าที่อ้างอิงจาก Rails 3 แต่ฉันเพิ่งพบเจอและแก้ไขกับ Rails 4.0.4 ดังนั้นฉันจึงคิดว่าฉันควรจะแก้ไขอย่างไรสำหรับใครก็ตามที่พบปัญหานี้กับรุ่นนี้ ระยะของคุณอาจแตกต่างกันไป แต่นี่คือสิ่งที่ทำงานให้ฉัน

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งอัญมณีและเรียกใช้การติดตั้งแบบกลุ่ม

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

ใน application.js ตรวจสอบว่าจำเป็นต้องมีทุกอย่างเช่นด้านล่าง

ระวังถ้า gotcha นี้ : มัน//= require jquery.turbolinksและไม่//= require jquery-turbolinks

//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .

จากนั้นเพิ่มลิงก์ที่เหมาะสมในส่วนหัวของ application.html.erb

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

ดูเหมือนจะมีหลายรูปแบบในการใช้วิธีการลบที่ฉันคิดว่าขึ้นอยู่กับรุ่นของ Rails ที่คุณใช้ นี่คือdeleteไวยากรณ์ที่ฉันใช้

<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

หวังว่าจะช่วยขุดคนออกจากหลุมที่น่าผิดหวังอย่างนี้!


0

โดยทั่วไปเมื่อคุณได้รับ "ไม่พบเส้นทางที่ตรงกัน" แต่คุณคิดว่าคุณมีเส้นทางที่กำหนดไว้แล้วให้ตรวจสอบวิธีการ http / verb / คำขออีกครั้ง (ไม่ว่าจะเป็นรับวางโพสต์ลบ ฯลฯ ) สำหรับเส้นทางนั้น

หากคุณเรียกใช้เส้นทางเรคคุณจะเห็นวิธีการที่คาดหวังและคุณสามารถเปรียบเทียบกับบันทึกการร้องขอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.