ruby on rails - कोई मार्ग मिलान नहीं करता है "/ उपयोगकर्ता/sign_out" रेलवे तैयार 3




ruby-on-rails ruby-on-rails-3 (20)

Github में स्रोत कोड के साथ इसे देखें:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (दिनांक: 27 जून, 2011)

  • # संसाधन को साइन आउट करने के लिए उपयोग की जाने वाली डिफ़ॉल्ट HTTP विधि। डिफ़ॉल्ट है: मिलता है। 188
  • # config.sign_out_via =: 187 प्राप्त करें
  • # संसाधन को साइन आउट करने के लिए उपयोग की जाने वाली डिफ़ॉल्ट HTTP विधि। डिफ़ॉल्ट है: हटाएं। 188
  • config.sign_out_via =: हटाएं

मैंने अपने ऐप पर डिज़ाइन स्थापित किया है और मेरी 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 चला गया और पुष्टि की कि सभी मार्ग मान्य हैं।

इसके अलावा, मेरे devise_for :users फ़ाइल में मेरे पास devise_for :users और root :to => "home#index"

"साइन आउट" लिंक पर क्लिक करते समय मुझे निम्न रूटिंग त्रुटि मिलती है:

No route matches "/users/sign_out"

कोई विचार क्या त्रुटि पैदा कर रहा है?


अधिकांश उत्तर आंशिक हैं। मैंने इस मुद्दे को कई बार मारा है। दो चीजों को संबोधित करने की जरूरत है:

<%= 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

अपने application.js में निम्न पंक्ति शामिल करना न भूलें (रेल 3)

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

मेरे रेल आवेदन में jquery_ujs शामिल करें और यह अब काम करता है।


अपने मार्गों में। आरबी:

 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 %>

आम तौर पर जब आपको "कोई मार्ग मिलान नहीं होता" लेकिन आपको लगता है कि आपके पास उस मार्ग को परिभाषित किया गया है, तो उस रूट के लिए http क्रिया / अनुरोध विधि (चाहे उसे प्राप्त करें, डालें, पोस्ट करें, हटाएं आदि) को दोबारा जांचें

यदि आप रेक मार्ग चलाते हैं तो आपको अपेक्षित विधि दिखाई देगी और आप अनुरोध लॉग के साथ इसकी तुलना कर सकते हैं।


इसका मतलब है कि आपने jquery-rails मणि स्थापित करने के बाद jquery फ़ाइलों को जेनरेट नहीं किया है। तो सबसे पहले आपको इसे उत्पन्न करने की आवश्यकता है।

rails generate devise:install

पहला विकल्प:

इसका मतलब है कि आपको या तो /config/initializers/devise.rb पर निम्न पंक्ति को /config/initializers/devise.rb

config.sign_out_via =: config.sign_out_via = को हटाएं: प्राप्त करें

दूसरा विकल्प:

आप केवल इस पंक्ति को <%= link_to "Sign out", destroy_user_session_path %> <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> व्यू फ़ाइल पर <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

आमतौर पर :method => :delete डिफ़ॉल्ट रूप से नहीं लिखा जाता है।


उपयोग करें :get और :delete अपने पथ के लिए विधि :delete :

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

एक अपवाद के साथ, जेसी के जवाब ने मेरे लिए काम किया:

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

परिवर्तन:

:delete

... सेवा मेरे:

'delete'

तो कोड जो मेरे लिए काम करता है वह है:

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

जोड़ें:

  <%= 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

तैयार / सत्र # नष्ट करने और उससे जोड़ने के लिए एक नया मार्ग जोड़ने का प्रयास करें। उदाहरण के लिए:

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

राय:

<%= link_to "Logout", logout_path %>

पहले से ही सवाल के कई जवाब। मेरे लिए समस्या दो गुना थी:

  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 का उपयोग कर रहा है और इसे GET के रूप में भेजता है। इसलिए आपको यह करना होगा:

    //= require jquery
    //= require jquery_ujs
    
  4. और निश्चित रूप से पहले उल्लेख किए गए एक ही लिंक के रूप में:

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

बहुत सारे समाधान हैं। लेकिन ज्यादातर इसका उपयोग करते हैं,

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

या उचित sign_out विधि के साथ config devise.rb कॉन्फ़िगर करें

Devise.rb में

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

मुझे रेल 3.1.0 के साथ एक ही समस्या थी, और मैंने अनुवर्ती लाइनों को फाइल में जोड़ने का हल किया:

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

मुझे लगता है कि साइन आउट करने का मार्ग एक DELETE विधि है। इसका मतलब है कि आपके साइन आउट लिंक को इस तरह दिखने की आवश्यकता है:

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

आपके इसमें शामिल नहीं है :method => :delete भाग :method => :delete । साथ ही, कृपया ध्यान दें कि इस काम के लिए आपको अपनी लेआउट फ़ाइल ( application.html.erb ) में <%= javascript_include_tag :defaults %> भी शामिल करना होगा।


मैंने इस लाइन को devise.rb में बदल दिया:

config.sign_out_via = :delete

सेवा मेरे

config.sign_out_via = :get

और यह मेरे लिए काम करना शुरू कर दिया।


मैंने यही किया (रेल 3.0 और डेविस 1.4.2 के साथ):

  1. सुनिश्चित करें कि आपका पृष्ठ rails.js लोड करता है
  2. इस param का प्रयोग करें: 'डेटा-विधि' => 'हटाएं'
  3. इस param को जोड़ने का अच्छा विचार:: rel => 'nofollow'

यदि आप रेल 3.1 का उपयोग कर रहे हैं तो सुनिश्चित करें कि आपका application.html.erb साइन आउट इस तरह दिखता है:

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

और यह कि आपकी जावास्क्रिप्ट में निम्न शामिल हैं जैसे लाइन दिखती है

<%= javascript_include_tag 'application' %>

मेरा अनुमान है कि कुछ रत्न डिफ़ॉल्ट.जेएस स्थान की नई संरचना को ओवरराइट करते हैं।


लॉगआउट लिंक को डिलीट रीस्टफुल कॉल करने की क्षमता को रेल कोड = link_to('Logout', destroy_user_session_path, :method => :delete) का उपयोग करके एक HTML विशेषता data-method = "delete" आवश्यकता होती है।

हालांकि, अगर आपके पास मणि jquery-ujs इंस्टॉल नहीं है या आपके application.html में = javascript_include_tag "application" माध्यम से परिणामस्वरूप जावास्क्रिप्ट को कॉल नहीं कर रहा है, तो प्रतिक्रिया GET अनुरोध के रूप में भेजी जाएगी, और मार्ग विफल हो जाएगा।

यदि आप jquery-ujs का उपयोग नहीं करना चाहते हैं या इसे काम करने का कोई तरीका नहीं ढूंढ पा रहे हैं तो आपके पास कुछ विकल्प हैं:

  1. devise.rb को बराबर में बदलें :get devise.rb भीतर devise.rb (अनुशंसित नहीं है, क्योंकि DELETE उपयुक्त रीस्टफुल क्वेरी है)
  2. या = button_to('Logout', destroy_user_session_path, :method => :delete) से = button_to('Logout', destroy_user_session_path, :method => :delete) बदलें। button_to रेल के साथ उचित डिलीट कॉल करने पर भारी भारोत्तोलन होगा। यदि आप चाहें तो लिंक के समान दिखने के लिए बटन को स्टाइल कर सकते हैं।

':method => :delete ' पृष्ठ में ' data-method="delete" , इसलिए आपके पृष्ठ में jquery_ujs.js होना चाहिए, यह विधि हटाने के साथ लिंक सबमिट करेगा विधि नहीं


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




routes