Devise लॉगिन सेट करना रूट पेज होना चाहिए


84

मैं अपने मार्गों के लिए निम्नलिखित कोड का उपयोग कर रहा हूं:

devise_for :user, 
  :as => '', 
  :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
  }

लेकिन जब मैं लॉग आउट हो जाता हूं और मुझे गेटो /logoutमिलता है तो मुझे निम्नलिखित त्रुटि मिलती है:

कोई भी मार्ग {: क्रिया => "नया", नियंत्रक => "वसीयत / सत्र"} से मेल नहीं खाता

मैं :sign_inकार्रवाई करने के लिए रूट पथ कैसे सेटअप करूं ?

जवाबों:


125

उन लोगों से अनुसरण करने के लिए जो त्रुटि के बारे में पूछ रहे हैं Could not find devise mapping for path "/", एक समाधान है।

आप पाएंगे कि आपके लॉग में एक सुराग है जो शायद कहेगा:

[Devise] Could not find devise mapping for path "/".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
    match "/some/route" => "some_devise_controller"
  end

2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

   @request.env["devise.mapping"] = Devise.mappings[:user]

इसलिए मैंने दृष्टिकोण को वापस ले लिया, लेकिन इसे एक स्कोप ब्लॉक के अंदर लपेटकर (@miccet शर्करा के रूप में):

devise_scope :user do
  root to: "devise/sessions#new"
end

इसने मेरे लिए ठीक काम किया


6
इसने मुझे एक अनंत लूप में भेज दिया, प्रिय पाठक, जो एक ही समस्या है, उत्तर का अगला चरण यहाँ है stackoverflow.com/questions/19855866/…
Jngai1297

93
devise_for :users

devise_scope :user do
  authenticated :user do
    root 'home#index', as: :authenticated_root
  end

  unauthenticated do
    root 'devise/sessions#new', as: :unauthenticated_root
  end
end

बस इस तरह, रेल पटरियों पर परीक्षण किया गया 4.1.1.rc1।


1
मुझे संदेह है कि यह सब रेल और डेविस के संस्करण पर निर्भर करता है। यह निश्चित रूप से राइज़ 4 के लिए डेविस 3 के साथ काम करता है - अधिकांश अन्य उत्तर नहीं थे।
क्रिस लुईस

मुझे लगता है कि यह इसे करने का सबसे अच्छा तरीका है। यह रेल्स 4.2.7.1 और डेविस 4.2.0
लुइस लेक्ज़ानो एयराल्डी

23
root :to => "devise/sessions#new"

मुझे डिफ़ॉल्ट होम रूट सेट करने की आवश्यकता है। मुझे ऐसा लगा जैसे मैंने कल रात पूरी कोशिश की थी (प्रश्न पोस्ट करने से पहले), लेकिन यह अब काम कर रहा है। यदि आप लॉग आउट हो गए हैं, तो डेवीस आपको उस रूट पथ पर पुनर्निर्देशित करने का प्रयास करता है, जिसे मैंने अपरिभाषित किया था।


14
किसी भी विचार मैं यह क्यों मिलता है? पथ "/" के लिए डेविस मैपिंग नहीं मिली। हो सकता है कि आप अपने ब्लॉक को स्कोप ब्लॉक के अंदर लपेटना भूल गए हों?
baash05

इस का एक समाधान है "डेविस मैपिंग नहीं मिल सका" त्रुटि जो स्पष्टता के लिए मैंने इस पृष्ठ पर एक अलग उत्तर में पोस्ट की है: stackoverflow.com/a/12994856/400790
पीटर निक्सी

15

(यह एक सुझाए गए संपादन के रूप में पोस्ट किया गया था , लेकिन इसका खुद का एक उत्तर होना चाहिए था। मुझे नहीं पता कि यह समझ में आता है या नहीं। प्रिय अनाम संपादक: इस उत्तर को अपने अनुसार देने के लिए स्वतंत्र महसूस करें, और मुझे एक टिप्पणी छोड़ दें। इसलिए मैं इस प्रति को हटा दूंगा।)

root :to => redirect("/users/login")

3
कृपया ध्यान दें, यह मार्ग एक पुनर्निर्देशन है। यह रूट URL पर पेज में साइन को प्रदर्शित नहीं करता है। ऐसा करने के लिए, आपको मार्ग बनाने की आवश्यकता है devise_scope: उपयोगकर्ता रूट करें: => "devise / session # नया" अंत जैसा कि @PeterNixey द्वारा सुझाया गया है
Robert

11

मुझे यह @VvDPzZ उत्तर के साथ काम करने के लिए मिला। लेकिन मुझे इसे थोड़ा संशोधित करना पड़ा

  devise_scope :business_owner do
    authenticated  do
      root to: 'pages#dashboard'
    end

    unauthenticated do
      root to: 'devise/sessions#new', as: 'unauthenticated_root'
    end
  end  

मुझे to:रूट पथ घोषणा में विज्ञापन देना था । मैंने भी हटा दिया as: :authenticated_rootक्योंकि मेरे पास पहले से ही root_pathलिंक में मेरे आवेदन संदर्भित में कुछ स्थान थे । as: :authenticated_rootभाग को छोड़कर मुझे अपने किसी भी मौजूदा लिंक को बदलना नहीं था।


3

मुझे लगता है कि आपके पास अलग-अलग उपयोगकर्ता भूमिकाएं हैं। यदि आपको उपयोगकर्ताओं के संसाधन में इस तरह की गुंजाइश जोड़ना है:

  devise_scope :user do
    get "/logout" => "devise/sessions#destroy"
  end

आप यहां से मार्ग बदलने के बारे में अधिक पढ़ सकते हैं: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes


यह इतना नहीं है कि मैं लॉगआउट मार्ग तक नहीं पहुंच सकता। यह तब होता है जब आप लॉग आउट हो जाते हैं लॉग आउट रूट आपको रूट करने के लिए पुनर्निर्देशित करता है।
लोगन बेली

1

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

'get' 'users/root', to: 'users#root'Config / मार्गों में जोड़ें ।rb।

UsersController में कुछ ऐसा करें:

def root
  if user_signed_in?
    redirect_to root_for_signed_in_user_path (or whatever)
  else
    redirect_to new_user_session_path
  end
end

0

रेल्स 3.2 का उपयोग करना और 3.2.3 का उपयोग करना। मैं अपने होम पेज को " होम # इंडेक्स " (कंट्रोलर # एक्शन) सेटअप करने का प्रबंधन करता हूं क्योंकि लॉगिन पेज निम्नलिखित बदलाव करता है।

# 1 होम पेज पर लॉगिन फॉर्म जोड़ा गया:

<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
    <%= f.input :email %>
    <%= f.input :password %>
    <%= f.button :submit %>
<% end %>

# 2 जोड़े गए तरीके resource_name, संसाधन और devise_mapping से ऐप / सिपर्स / एप्लिकेशन_हेलपर.बीआर :

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

# 3 एक कस्टम सत्र नियंत्रक ऐप / नियंत्रक / उपयोगकर्ता / session_controller.rb बनाया गया :

class Users::SessionsController < Devise::SessionsController

   protected

   # This method tell sessions#create method to redirect to home#index when login fails.
   def auth_options
      { scope: resource_name, recall: 'home#index' }
   end

end

# 4 सत्र मार्गों को छोड़ें और कस्टम सत्र नियंत्रक को config / path.rb में सेट करें :

devise_for :users, path: 'auth', skip: [:sessions],
           controllers: {
               sessions: 'users/sessions'
           }

as :user do
  get 'auth/sign_in' => 'home#index', as: :new_user_session
  post 'auth/sign_in' => 'users/sessions#create', as: :user_session
  delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.