2011-02-14 16 views
17

देवता मुझे एक कठिन समय दे रहा है के बाद रीडायरेक्ट करें। अभी के लिए, साइन अप रीडायरेक्ट को छोड़कर, बाकी सब कुछ काम कर रहा है। मैं साइन अप या लॉगिन (लॉगिन वास्तव में काम करता है) पर, इंडेक्स एक्शन पर अपने टाउन कंट्रोलर पर रीडायरेक्ट करना चाहता हूं।साइन अप

मैं RegistrationsController अधिभावी की कोशिश की है और मैं की तरह एक applicationsController समारोह जोड़ने की कोशिश की है:

def after_sign_in_path_for(resource_or_scope) 
    if resource_or_scope.is_a?(User) 
     town_path 
    else 
     super 
    end 
    end 

फिर भी, मैं एक ही त्रुटि हो रही है:

NoMethodError in User/townController#index 

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.* 

गंभीरता से, मैं नहीं मिल सकता है ऐसा करने का एक तरीका। कोई विचार कृपया? :)

संपादित करें: मेरा मार्ग

 new_user_session GET /users/sign_in(.:format)      {:action=>"new", :controller=>"devise/sessions"} 
      user_session POST /users/sign_in(.:format)      {:action=>"create", :controller=>"devise/sessions"} 
    destroy_user_session GET /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"} 
     user_password POST /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"} 
    new_user_password GET /users/password/new(.:format)     {:action=>"new", :controller=>"devise/passwords"} 
    edit_user_password GET /users/password/edit(.:format)     {:action=>"edit", :controller=>"devise/passwords"} 
         PUT /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"} 
    user_registration POST /users(.:format)        {:action=>"create", :controller=>"devise/registrations"} 
new_user_registration GET /users/sign_up(.:format)      {:action=>"new", :controller=>"devise/registrations"} 
edit_user_registration GET /users/edit(.:format)       {:action=>"edit", :controller=>"devise/registrations"} 
         PUT /users(.:format)        {:action=>"update", :controller=>"devise/registrations"} 
         DELETE /users(.:format)        {:action=>"destroy", :controller=>"devise/registrations"} 
        root  /(.:format)         {:action=>"index", :controller=>"home"} 
      user_root  /user(.:format)        {:action=>"index", :controller=>"user/town"} 
        home  /home(.:format)        {:action=>"index", :controller=>"home"} 
        town  /town(.:format)        {:action=>"index", :controller=>"town"} 
       inbox  /messages(.:format)       {:action=>"index", :controller=>"messages"} 
       inbox  /messages/inbox(.:format)      {:action=>"inbox", :controller=>"messages"} 

routes.rb:।

devise_for :users 

    root :to => "home#index" 

    namespace :user do 
    root :to => "town#index" 
    end 

    scope :path => '/home', :controller => :home do 
    match '/' => :index, :as => 'home' 
    end 

    scope :path => '/town', :controller => :town do 
    match '/' => :index, :as => 'town' 
    end 
...... 
+0

हमें '$ रेक routes' कृपया – raidfive

+0

Thanx के माध्यम से अपने मार्ग दिखाएं, मैं जोड़ा प्रासंगिक मार्गों – Spyros

+1

हमें अपने routes.rb अंदर अपनी वसीयत निर्देश दिखाएं। इसकी प्रकृति से, संसाधन उपयोगकर्ता नहीं है। यह वास्तव में कौन सा वर्ग है यह चित्रित करें। – Dex

उत्तर

11

इस तरह मुझे यह काम मिल गया।

# In your routes.rb 
match 'dashboard' => 'user_dashboard#index', :as => 'user_root' 

तो सुनिश्चित करें कि आप अपने home#index नियंत्रक पर एक before_filter :authenticate_user! सेट नहीं है बनाते हैं।

+1

डेविस 1.2.आरसी के बाद से, डेविस विकी में इसे प्राप्त करने का एक पसंदीदा तरीका रहा है https://github.com/plataformatec/devise/wiki/ कैसे-टू-3-ए-रीडायरेक्ट-टू-ए-विशिष्ट-पेज-ऑन-सफल-साइन-अप-% 28 पंजीकरण% 29 http://stackoverflow.com/a/6402730/544068 – qsun

6

के बाद से कोई भी उत्तर नहीं है मैं में झंकार करेंगे क्या आप वाकई इस कोड है कि जिसके कारण त्रुटि है कर रहे हैं ? आपका resource_or_scope शून्य होने से ऐसा लगता है कि डेविस समस्या है लेकिन मुझे संदेह है कि यह मामला है। तो मुझे लगता है कि समस्या कहीं और है।

मैं यह सुनिश्चित करने के लिए निम्नलिखित प्रयास करता हूं कि यह पहले काम करता है।

def after_sign_in_path_for(resource) 
    "http://www.google.com" 
    end 

यदि वह काम करता है तो resource चर जाँच यकीन है कि यह नहीं के बराबर नहीं है बनाने के लिए प्रयास करें।

+0

हैलो, मैंने वास्तव में पहले एक ही कोड की कोशिश की है और यह केवल लॉगिन पर काम करता है।लेकिन साइन अप करने के बाद लॉग इन करने पर नहीं। – Spyros

+0

डेविस विकी से * किसी उपयोगकर्ता में साइन इन करने के बाद, खाते की पुष्टि करना या पासवर्ड अपडेट करना, डेविस रीडायरेक्ट करने के लिए स्कॉप्ड रूट पथ की तलाश करेगा। उदाहरण: एक: उपयोगकर्ता संसाधन के लिए, यह मौजूद होने पर user_root_path का उपयोग करेगा *। मुझे लगता है कि आपके पास अपने मार्गों में 'user_root' है। क्या वह कहां खत्म हो रहा है? – Dty

+0

मेरे पास नेमस्पेस है: उपयोगकर्ता रूट करें: => "टाउन # इंडेक्स" अंत में और यह वास्तव में साइन इन करने पर शहर/अनुक्रमणिका में समाप्त होता है। हालांकि, जब कोई नया उपयोगकर्ता साइन अप करता है और लॉग इन होता है (डिफ़ॉल्ट व्यवहार तैयार करता है) मुझे उपरोक्त त्रुटि मिलती है (फिर भी यह शहर/अनुक्रमणिका पर रीडायरेक्ट करता है, लेकिन उस त्रुटि के साथ, ऐसा लगता है कि मेरे पास current_user ऑब्जेक्ट नहीं है)। – Spyros

2

क्या आपने sign_in_and_redirect विधि को ओवरराइट करने की कोशिश की थी; यह आपके लिए काम करेगा

def sign_in_and_redirect(resource_or_scope,resource) 
    if resource_or_scope == :user 
     redirect_to town_path 
    else 
     super 
    end 
end 
+0

ने कहा कि मेरे कस्टम पंजीकरण नियंत्रक में, लेकिन अभी भी एक ही त्रुटि हो रही है:/ – Spyros

0

मुझे एक ही समस्या थी। अंततः आवेदन नियंत्रक में अगर बयान का सहारा लिया। यदि उपयोगकर्ता ने साइन इन किया है और उनके पास प्रोफ़ाइल नहीं है तो new_profile_path

1

सुनिश्चित नहीं है कि यह सहायक है या नहीं, लेकिन मैं उपरोक्त समस्याओं में भाग गया लेकिन अंतर यह है कि मैं एक कस्टम पंजीकरण नियंत्रक का उपयोग कर रहा हूं।

पंजीकरण के लिए तैयार स्रोत कोड से नियंत्रक यह प्रतीत होता है कि यह sign_in_and_redirect को कॉल कर रहा है जो बदले में इसे redirect_location विधि से गुजरता है।

मैं redirect_location_for (scope) के बजाय after_sign_up_path_for (संसाधन) से पथ वापस करने के लिए redirect_location को ओवरराइड करता हूं || after_sign_up_path_for (संसाधन)।

after_sign_up_path_for (संसाधन) के भीतर, मैं विधि उपयोगकर्ता के प्रकार रेल 3.0.5 में

काम करता है और मेरे लिए वसीयत 1.3.0 के आधार पर सही रास्ते पर रीडायरेक्ट करने को अनुकूलित।

14

मैं रूबी ऑन रेल 3.0.7 के साथ डेविस 1.3.4 का उपयोग कर रहा हूं।एक समाधान के लिए इंटरनेट की जाँच के बाद, क्या मैंने किया बस निम्नलिखित कोड

* पहले) * स्वागत पृष्ठ अप करने के लिए एक सफल चिह्न के बाद पुन: निर्देशित करने के लिए, जगह /config/routes.rb में निम्नलिखित चिपकाने था (ध्यान दें, तर्क आप devise_for करने के लिए प्रदान के साथ :user डालें):

namespace :user do 
root :to => "welcome#index" 
end 

* सेकंड) */ऐप्स/नियंत्रक/application_controller में स्वागत पृष्ठ भी), जगह पर एक संकेत बाहर के बाद पुन: निर्देशित करने के लिए (इस विधि को आरआरबी:

private 
# Overwriting the sign_out redirect path method 
def after_sign_out_path_for(resource_or_scope) 
welcome_index_path 
end 

यह मेरे लिए काम करता है, मुझे उम्मीद है कि यह आप सभी के लिए करता है।

1

मुद्दा यह है कि वसीयत नजरअंदाज after_sign_in_path_for(resource) जब एक संसाधन अभी बनाया गया है कि में साइन इन है। क्या आप की जरूरत after_sign_up_path_for(resource) है:

# override in your ApplicationController or custom Devise::RegistrationsController 
def after_sign_up_path_for(resource) 
    if resource.is_a?(User) 
    town_path 
    else 
    super 
    end 
end 

आप अभी भी अपने after_sign_in_path_for(resource) ओवरराइड की आवश्यकता होगी सही ढंग से संसाधन के लिए बाद में संकेत इन्स को अंतरित करें।

1

टोनी ने क्या कहा। नेमस्पेस इस तरह इस्तेमाल नहीं किया जाना है। मुझे नहीं पता कि इस हैक के साथ कौन आया था जो बिल्कुल काम नहीं करता है, लेकिन दुर्भाग्यवश, यह पहले समाधानों में से एक है जो गुगलते समय आते हैं।

namespace :user do 
    root :to => "town#index" 
end 

सेट user_root_path और अंक 'उपयोगकर्ता/शहर नियंत्रक के सूचकांक कार्रवाई है जो आप की जरूरत नहीं है के रूप में'/उपयोगकर्ता। आपके पास 'टाउन' नियंत्रक क्या है। और यही कारण है कि आपको त्रुटि मिली है। क्या आप की जरूरत

get '/town', to: 'town#index', as: 'user_root' 

है इस तरह, '/ शहर' 'शहर # सूचकांक' की ओर इशारा करता है और अपने user_root_path है, जो है क्या वसीयत में उपयोगकर्ता के बाद

  1. संकेत पर रीडायरेक्ट रूप में सेट है
  2. साइन अप करें
  3. अद्यतन पासवर्ड

ताकि आप भी after_sign_in_path_for है, जो, w के विपरीत ओवरराइड करने के लिए की जरूरत नहीं है टोपी कई मानते हैं, तैयार रीडायरेक्ट समस्या से निपटने के लिए सबसे अच्छी जगह नहीं है।

ऑन रेल्स 4.1+ और वसीयत 3.2

+1

हम आप थोड़े सही हैं। हमें उद्धरणों के साथ अपने 'as:' user_root'' को संपादित करने की आवश्यकता है और सुनिश्चित करें कि आप कहीं भी 'towns_path' का उपयोग न करें या आपको उन्हें भी बदलना होगा, क्योंकि आप अपने ऐप में उस सहायक के किसी भी उपयोग पर त्रुटि करेंगे । – pjammer

संबंधित मुद्दे