2011-02-10 38 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