2011-02-10 40 views
65

我使用我的路線如下代碼:設置設計登錄是根頁

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

但是,當我登錄了,我轉到/logout我得到以下錯誤:

No route matches {:action=>"new", :controller=>"devise/sessions"}

如何設置根路徑是:sign_in行動?

回答

99

從誰問有關錯誤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 suggets)的作用域塊內:

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

這個工作對我罰款

+3

的建議這給我發過一個無限循環,親愛的讀者誰有同樣的問題,答案的下一步是在這裏http://stackoverflow.com/questions/19855866/how-to-set-devise-sign-in-page-as-root-page-in-rails – Jngai1297

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

我需要設置默認首頁根。我覺得我昨晚整夜都在嘗試這種方式(在發佈問題之前),但現在正在工作。如果您退出,Devise會嘗試將您重定向到我未定義的根路徑。

+13

任何想法爲什麼我得到這個?無法找到路徑「/」的設計映射。也許你忘了把你的路線包裹在範圍塊內? – baash05

+0

有一個解決方案,這個「無法找到設計映射」的錯誤,爲了清晰起見,我已經發布在本頁的單獨答案:http://stackoverflow.com/a/12994856/400790 –

+0

答案是正下方.. – Nithin

13

(這被張貼爲suggested edit,但應該是一個自己的答案,我不知道這是否有意義或不尊敬的匿名編輯:。隨意轉貼這個答案是你自己的,並給我留下了評論,所以我會刪除此副本。)

root :to => redirect("https://stackoverflow.com/users/login") 
+3

請注意,此路線是重定向。它不會在根網址上顯示登錄頁面。要做到這一點,你需要創建路由 devise_scope:用戶做 根:到=>「設計/會話#新」 結束 通過@PeterNixey – Robert

72
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 

就這樣,on Rails的Rails的4.1測試.0.rc1。

+1

我懷疑這一切都取決於Rails和Devise的版本。這當然適用於Devise 3的Rails 4 - 其他大多數答案都沒有。 –

+0

我認爲這是做到這一點的最佳方式。它適用於Rails 4.2.7.1和Devise 4.2.0 – luislezcair

+0

太棒了!我喜歡這個代碼。謝謝。 – Penguin

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到應用程序/ heldpers/application_helper。RB

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

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

#3創建的自定義會話控制器應用程序/控制器/用戶/ sessions_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/routes.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 
9

我得到了這個工作與@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部分,我不必更改任何現有鏈接。

0

其中一些解決方案過於複雜。只需使用你的Rails技能就可以將頭部向上移動:

'get' 'users/root', to: 'users#root'添加到config/routes.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